我有以下代码:
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:
^{pr2}$问题是,当我加载settings
时,settings.daily
没有设置。settings.annual_volatility_target
是,不管我是否在{
如果我手动实例化一个Settings
对象(即不使用PyYAML),它可以正常工作。在
我做错什么了?在
一种可能是为
Settings
编写一个constructor:我必须使用修改后的
^{pr2}$yaml
文件(我无法使其与注释!!python/object:v.Settings
一起工作):PyYAML中的Python对象是通过两个步骤构建的。首先调用
__new__
(在Constructor.make_python_instance()
)然后设置属性(在Constructor.set_python_instance_state()
)。这两步过程是必需的,因为YAML支持对对象的引用,并且如果该对象(间接地)是自引用的,则无法一次性构造它,因为它所依赖的参数(包括自身)还不可用。在你可以用两种方法来解决这个问题。您可以为
Settings
定义__setstate__()
,它将用dict
调用,并从__init__()
调用:另一个更通用的(非PyYAML)解决方案是在第一次访问时创建
^{pr2}$daily
值:如果您经常访问
daily
,那么您应该在第一次计算值时将其缓存到例如self._daily
中:相关问题 更多 >
编程相关推荐