标签: python-attrs

如何使用Python模块“ attrs”实现“ attr.asdict(MyObject)”的反向转换

在Python模块的文档attrs 指出,有一种方法可以将属性的类转换为字典表示形式:

例:

>>> @attr.s
... class Coordinates(object):
...     x = attr.ib()
...     y = attr.ib()
...
>>> attr.asdict(Coordinates(x=1, y=2))
{'x': 1, 'y': 2}
Run Code Online (Sandbox Code Playgroud)

如何实现对立面:Coordinates从有效的字典表示形式中获取的实例,而不使用样板内容,并且对attrs模块感到满意?

python attributes python-attrs

3
推荐指数
2
解决办法
1439
查看次数

Python attrs - 超类中的位置属性,而子类中是可选的

我有两个非常类似的类:A和B:

import attr
@attr.s
class A(object):
   x = attr.ib()
   y = attr.ib()

@attr.s
class B(object):
   x = attr.ib()
   z = attr.ib()
   y = attr.ib(default=None)
Run Code Online (Sandbox Code Playgroud)

如您所见,它们共享2个属性(x和y),但在类A中,y属性是位置,而在B中它是可选的.

我想在一个超类中对这些类进行分组,但如果我尝试使类继承自类AI,则会出现以下错误:

SyntaxError: duplicate argument 'y' in function definition
Run Code Online (Sandbox Code Playgroud)

添加了用于引发错误的代码:

@attr.s
class A(object):
    x = attr.ib()
    y = attr.ib()


@attr.s
class B(A):
    z = attr.ib()
    y = attr.ib(default=None)
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:是否可以使用attrs模块将这些类组合在一个超类中?如果不是,你会建议我将它们分组为"旧时尚"方式(我自己实施init方法)吗?

非常感谢!

python python-attrs

3
推荐指数
1
解决办法
817
查看次数

仅在 __attrs_post_init__ 结束后运行属性验证器

我有:

@attr.s
class Example:
    number = attr.ib(validator=attr.validators.instance_of(int), init=False)

    def __attrs_post_init__(self):
        self.number = 'string'
        print('It seems, validation was running before:(')


t = Example()
Run Code Online (Sandbox Code Playgroud)

这里如何正确设置验证?我想在实例化后验证 self.number。

python python-attrs

2
推荐指数
1
解决办法
978
查看次数

如何使用元组和 dict 解包制作 attrs 类但没有额外的方法

我刚开始使用attrsPython 模块,它非常漂亮(或者类似地,我们可以使用 Python 3.7 DataClasses)。我有一个常见的使用模式是让类成为参数值的容器。我喜欢分配参数时的标签,以及更清晰的属性样式引用值,但我也喜欢在将值存储在有序 dict 之类的东西中时有几个很好的功能:

  1. *像 atuple或 a一样解包list以输入函数参数
  2. ** 当需要或需要传递关键字时解压缩。

我可以通过在类中添加三个方法来实现这一切

@attr.s
class DataParameters:
    A: float = attr.ib()
    alpha: float = attr.ib()
    c: float = attr.ib()
    k: float = attr.ib()
    M_s: float = attr.ib()

    def keys(self):
        return 'A', 'alpha', 'c', 'k', 'M_s'

    def __getitem__(self, key):
        return getattr(self, key)

    def __iter__(self):
        return (getattr(self, x) for x in self.keys())
Run Code Online (Sandbox Code Playgroud)

然后我可以使用这样的类:

params = DataParameters(1, 2, 3, 4, 5)
result1 = function1(100, 200, *params, 300) …
Run Code Online (Sandbox Code Playgroud)

python python-attrs python-dataclasses

2
推荐指数
1
解决办法
2330
查看次数

如何使用 attrs 和 cattrs 反序列化带有可选字段的 json

我想使用 attr 和 cattrs 反序列化 MongoDB 文档。由于 noSQL 没有固定的模式,我需要以某种方式指向 attr.ib-s,它们可能会被遗漏,而不是在这种情况下将它们添加到 dict 的对象中。

我之前使用过漏勺来做这种事情,它在漏勺.SchemaNode 构造函数中提供了一个“缺失”的参数,它通过将“漏勺”作为参数传递来做到这一点。我想知道如何对这些库做同样的事情,我在文档中没有找到任何内容。所以:

import attr
from cattr import structure

@attr.s
class ABC:
    A: float = attr.ib()
    B: float = attr.ib()
    C: float = attr.ib()

d = {'A': 1, 'B': 2}
obj = structure(d, ABC)
Run Code Online (Sandbox Code Playgroud)

应该返回一个只有 A 和 B 属性的对象。我一直在尝试使用一些参数(init、default...),甚至使用来自键入 lib 的 Optional 类,但是我尝试的所有方法都以某种方式返回了该属性。

谢谢你的帮助。

python json python-attrs

0
推荐指数
1
解决办法
1280
查看次数