使用 attrs 创建具有互斥参数的 Python 类

和我

我有一个具有两个互斥参数(pricesreturns)的类。也就是说,为了实例化一个对象,不能同时提供它们。

但是,该类需要两者进行内部计算。所以我想计算pd.Series用户提供的缺失值

我创建了两个替代类构造函数(from_pricesfrom_returns)。使用这些构造函数,该类将被正确实例化。

这是代码。它利用了attrs图书馆 ( www.attrs.org )。

import pandas as pd

import attr


@attr.s
class MutuallyExclusive:
    prices: pd.Series = attr.ib()
    returns: pd.Series = attr.ib()
    trading_days_per_year: int = attr.ib(default=252)

    @classmethod
    def from_prices(cls, price_series: pd.Series, trading_days: int = 252):
        return cls(
            price_series,
            price_series.pct_change(),
            trading_days,
        )

    @classmethod
    def from_returns(cls, return_series: pd.Series):
        return cls(
            pd.Series(data=100 + 100 * (returns.add(1).cumprod() - 1)),
            return_series,
        )


if __name__ == "__main__":
    prices = pd.Series(data=[100, 101, 98, 104, 102, 108])
    returns = pd.Series(data=[0.01, 0.03, -0.02, 0.01, -0.03, 0.04])

    obj_returns = MutuallyExclusive.from_returns(returns)
    obj_prices = MutuallyExclusive.from_prices(prices, trading_days=100)

但是,用户仍然可以调用obj = MutuallyExclusive(prices, returns),即使这两个系列彼此不兼容。捕捉这种情况并抛出错误的最佳方法是什么?

编辑:
是否可以一起“禁用”常规构造函数?如果可以仅通过替代构造函数实例化对象,这将解决问题,不是吗?

拉弗克

attrs图书馆这个正确的工具?为什么不使用常规的 python 类并定义__init__()自己?

import pandas as pd


class MutuallyExclusive:
    def __init__(self, prices: pd.Series = None, returns: pd.Series = None):
       if prices is not None and returns is not None:
          raise ValueError("prices and returns are mutually exclusive")
       self.prices = prices if prices is not None else pd.Series(data=100 * (1 + returns))
       self.returns = returns if returns is not None else prices.pct_change()

if __name__ == "__main__":
    prices = pd.Series(data=[100, 101, 98, 104, 102, 108])
    returns = pd.Series(data=[0.01, 0.03, -0.02, 0.01, -0.03, 0.04])

    obj_returns = MutuallyExclusive(returns=returns)
    obj_prices = MutuallyExclusive(prices=prices)

编辑:你更新了你的例子,所以我的答案没有,trading_days_per_year但概念是一样的。

如果您想使用该attrs库,其他人指出您可以将您的逻辑放在__attrs_post_init__函数中,请参见下面的示例,消除对类方法的需要注意,您需要将价格和收益都默认为None

def __attrs_post_init__(self):
    if self.prices is not None and self.returns is not None:
         raise ValueError("prices and returns are mutually exclusive")
    if self.returns is None:
       self.returns = self.price_series.pct_change()
    if self.prices is None:
       self.prices = pd.Series(data=100 + 100 * (self.returns.add(1).cumprod() - 1))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用attrs将JSON转换为Python类

您可以使用 namedtuples/dataclass/attrs 来创建一个灵活大小的类,还是必须使用传统类?

如何使用元组和字典解压缩但没有额外方法的情况下使attrs类

Python'NoneType'对象没有属性'attrs'

Django:FileField对象在类Meta中没有属性“ attrs”

如何从python的zip继承而使用class attrs?

Mypy 为带有 attrs 包的装饰类的子类返回错误“意外的关键字参数”

Python __attrs__解释

在 python attrs 类中,如何用我自己的覆盖生成的 __init__

Python attrs-父类中的位置属性,子类中的可选属性

在 Python 中使用具有并发期货的互斥锁

如何在python中使用参数创建单例类

Python:具有与基类相同的一组 __init__ 参数的子类,加上额外的参数,不使用 super()

如何使用已知类型作为参数创建具有泛型的泛型类?

对带有可变参数的类使用python click命令

返回了什么?使用(ATTRS)的R内部联接S,其中R和S没有共同的ATTRS

python继承:使用参数选择父类

Python创建类和使用方法

使用继承从Python类创建JSON

Python:使用YAML自动创建类方法

Python:如何使用Importlib创建类对象

使用Python不能创建多个类实例

在 Python 中使用类创建对象列表

使用 Selenium webdriver 创建新的 python 类

背景: url() 使用 .attrs() 函数

具有attrs的PyTorch模块无法获取参数列表

具有不同参数的 Python 类继承

使用现有类的属性创建新类时,python如何实例化属性?

具有元类的Python类设计