YAML 解析为对象 (PyYAML Python3)

2024-02-23

我有以下代码:

class Settings:
    def __init__(self, annual_volatility_target):
        self.annual_volatility_target = annual_volatility_target
        self.daily = annual_volatility_target/np.sqrt(252)

def yaml_load(name):
    with open('yaml/' + str(name) + '.yaml', 'r') as ymlfile:
        return yaml.load(ymlfile)

settings = yaml_load("settings")

使用以下 YAML:

!!python/object:v.Settings
annual_volatility_target: 0.25

问题是,当我加载时settings, settings.daily未设置。settings.annual_volatility_target是,无论我是否这么说__init__ or not.

如果我实例化一个Settings手动对象(即不使用 PyYAML),它工作正常。

我究竟做错了什么?


PyYAML 中的 Python 对象是通过两步过程构建的。第一的__new__被称为(在Constructor.make_python_instance())然后设置属性(在Constructor.set_python_instance_state())。需要这两个步骤的过程是因为 YAML 支持对对象的引用,并且如果该对象是(间接)自引用的,则无法一次性构造它,因为它所依赖的参数(包括其自身)尚不可用。

您可以通过两种方式解决这个问题。您可以定义__setstate__() for Settings这将被称为dict并从__init__()还有:

import yaml

yaml_str = """\
!!python/object:try.Settings
annual_volatility_target: 0.25
"""

class Settings:
    def __init__(self, annual_volatility_target):
        self.__setstate__({annual_volatility_target: annual_volatility_target})

    def __setstate__(self, kw):
        self.annual_volatility_target = kw.get('annual_volatility_target')
        self.daily = self.annual_volatility_target/np.sqrt(252)

    def __repr__(self):
        return "Setting({}, {})".format(self.annual_volatility_target, self.daily)

settings = yaml.load(yaml_str)

print(settings)

另一个更通用(非 PyYAML)的解决方案是创建daily第一次访问时的值:

class Settings:
    def __init__(self, annual_volatility_target):
        self.annual_volatility_target = annual_volatility_target

    @property:
    def daily(self):
         return annual_volatility_target/np.sqrt(252)

如果您访问daily通常,那么您应该将其缓存在例如self._daily第一次计算该值时:

class Settings:
    def __init__(self, annual_volatility_target):
        self.annual_volatility_target = annual_volatility_target
        self._daily = None

    @property:
    def daily(self):
         if self._daily is None:  
             self._daily = annual_volatility_target/np.sqrt(252)
         return self._daily
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

YAML 解析为对象 (PyYAML Python3) 的相关文章

随机推荐

  • 你如何制作一个makefile

    我想知道如何为 Unix 创建 makefile 这里有一个好的生成文件教程 http oucsace cs ohiou edu bhumphre makefile html 搜索 如何创建 makefile 后 Google 上的第一个结
  • 修复 Chocolatey“访问被拒绝”的问题

    我刚刚第一次使用安装了 Chocolateythis https i stack imgur com fw9WX png管理员 cmd 中的命令 SystemRoot System32 WindowsPowerShell v1 0 powe
  • dlopen 中对 __dlopen 的未知引用

    dlopen位于libdl a但是当我将我的应用程序链接到libdl a gcc 链接器抛出此错误 unknow reference to dlopen called in dlopen 我应该导入另一个吗 a 当我尝试静态编译时dlope
  • C 将输入文本文件解析为单词

    我正在尝试将输入文件 包含具有多行和分隔符的文本文档 即 解析为单词 我的函数 分割函数 是 int splitInput fp int i 0 char line 255 char array 5000 int x while fgets
  • Java Lambda:迭代 2 个暗淡数组并保持当前索引

    我是 Java 8 的 Lambda 表达式的新手 我想制定以下内容 我有一个二维数组 我想在应用程序代码中对其进行多次迭代 并对数组中的项目进行处理 在我执行以下操作之前 public static abstract class BlaB
  • 将 std::bind 的结果传递给 std::function “重载”

    我有类似的问题在 C 中将不同的 lambda 传递给函数模板 https stackoverflow com questions 40523248 passing different lambdas to function templat
  • 闭包编译器对命名空间枚举发出警告

    以下示例代码生成有关高级优化的编译器警告 JSC UNSAFE NAMESPACE 为命名空间 NS 创建的不完整别名 如果我删除 enum 注释 它不会发出警告 var NS enum string NS type FOO bar NS
  • 如何在 jupyter 笔记本中使用 pandas 分析时修复此错误

    每次我在不同的数据集中使用 pandas 分析时 笔记本都会显示此错误 IndexError 仅整数 切片 省略号 numpy newaxis None 且整数或布尔数组有效 指数 import pandas as pd df pd rea
  • Webpack ProvidePlugin 与外部插件?

    我正在探索使用的想法Webpack http webpack github io with 骨干网 js http backbonejs org 我已经遵循了快速入门指南 并且对 Webpack 的工作原理有了大致的了解 但我不清楚如何加载
  • Web 服务中的例外

    我的小组正在开发一个基于服务的 NET WCF 应用程序 我们正在尝试决定如何处理内部服务中的异常 我们应该抛出异常吗 返回序列化为 XML 的异常 只返回错误码 请记住 用户永远不会看到这些异常 它仅适用于应用程序的其他部分 WCF 用途
  • 对两个表进行 SQL 查询 - 返回一个表中的行,而另一个表中没有条目

    我有两个数据库表 类别和超级类别 用于我正在开发的库存控制系统 类别 ID Category 类别名称 超级类别 ID SuperCategory 类别 ID 超级类别 ID 我将类别 子类别关系放入 SuperCategories 表中
  • 如何用链接替换普通 URL,例如? [复制]

    这个问题在这里已经有答案了 我几乎已经成功了 我想知道是否有much更好的方法 根本问题 https stackoverflow com q 37684 1153319 Fiddle http jsfiddle net 5cr6K func
  • 索引(从零开始)必须大于或等于零

    嘿 我不断收到错误 索引 从零开始 必须大于或等于零且小于参数列表的大小 My code OdbcCommand cmd new OdbcCommand SELECT FirstName SecondName Aboutme FROM Us
  • Firebase 归因跟踪

    我在 归因 gt 网络设置 中添加了一些用于归因跟踪的网络 并添加了这些网络 SDK 但如何从 Firebase 中查看来自特定广告网络的转化 例如first open 如果我去归因 gt 点击first open gt 然后尝试应用过滤器
  • 覆盖使用媒体查询的 MuiTab 等组件

    我正在尝试为 MuiTab 提供 CSS 覆盖以增加字体大小 使用有关material ui上的CSS覆盖的文档 我已经设法增加了大多数元素的字体大小 但是我陷入了使用媒体查询的元素 因为它们产生比我通过覆盖提供的规则更具体的CSS规则 主
  • 无法在android compose Material3中使用rememberScaffoldState()

    我想用 记住脚手架状态 在android Material3 compose中 但无法使用它 OptIn ExperimentalMaterial3Api class Composable fun AppFeatureScreen view
  • 在 Visual Studio xml 编辑器中输入时如何跳过右引号?

    我喜欢在 Visual Studio xml 编辑器中自动插入引号 但我还没有找到一种简单的方法来跳过第二个引号 而无需将手移至光标键或按 End 键 当值是字符串时 是否有更简单的方法跳过第二个引号 如果值是枚举 Intellisense
  • 在远程场景中使用 IOC

    我正在努力让 IOC 在远程场景中工作 我将应用程序服务器设置为发布通过 XML 配置的服务 SingleCall 众所周知 它的工作原理如下 RemotingConfiguration Configure ConfigFile true
  • window.crypto.getRandomValues() 的兼容性

    我需要在 Javascript 中生成加密安全的伪随机数 我知道关于window crypto getRandomValuesAPI 这正是我想要的 不过 我也知道它是最近才推出的 2011 年左右 我可以放心地假设window crypt
  • YAML 解析为对象 (PyYAML Python3)

    我有以下代码 class Settings def init self annual volatility target self annual volatility target annual volatility target self