首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何忽略python-attrs类中的额外kwarg

如何忽略python-attrs类中的额外kwarg
EN

Stack Overflow用户
提问于 2020-01-31 03:29:49
回答 3查看 638关注 0票数 1

例如:

代码语言:javascript
复制
@attrs
class Foo:
  a = attrib()

f = Foo(a=1, b=2)

上面的代码会抛出一个错误,因为类Foo没有b属性。但是我想丢弃传递的b值,就好像我刚刚调用了f = Foo(a=1)一样。在我的用例中,我有动态dict (我想把它转换成attr-class),而且我根本不需要一些键。

EN

回答 3

Stack Overflow用户

发布于 2020-01-31 03:45:17

代码语言:javascript
复制
class FromDictMixin:
    @classmethod
    def from_dict(cls, data: dict):
        return cls(**{
            a.name: data[a.name]
            for a in cls.__attrs_attrs__
        })

@attrs
class Foo(FromDictMixin):
    a = attrib()

它是有效的,但看起来有点丑陋。我希望attrs lib有开箱即用的解决方案。

票数 1
EN

Stack Overflow用户

发布于 2021-10-09 20:45:29

我想我想出了一个更优雅的解决方案,它允许您在调整__init__逻辑的同时利用attrs的功能。有关详细信息,请参阅attrs documentation

代码语言:javascript
复制
@attr.s(auto_attribs=True, auto_detect=True)
class Foo():
    a: int
    optional: int = 3

    def __init__(self,**kwargs):
      filtered = {
        attribute.name: kwargs[attribute.name]
        for attribute in self.__attrs_attrs__
        if attribute.name in kwargs
      }
      self.__attrs_init__(**filtered)

上面的代码允许您指定无关的关键字参数。它还允许可选的参数。

代码语言:javascript
复制
>>> Foo(a = 1, b = 2)
Foo(a=1, optional=3)

attrs检测到显式初始化方法(由于auto_detect=True),并仍然创建初始化函数,但将其称为__attrs_init__。这允许您定义自己的初始化函数来进行预处理,然后在完成时调用__attrs_init__

代码语言:javascript
复制
>>> import inspect
>>> print(inspect.getsource(Foo.__attrs_init__))
def __attrs_init__(self, a, optional=attr_dict['optional'].default):
    self.a = a
    self.optional = optional
票数 1
EN

Stack Overflow用户

发布于 2020-02-01 13:44:55

这似乎更多的是序列化/反序列化/验证的问题,attrs出于多种原因对其参数进行了严格的限制。其中一个是键入(就像在类型中那样,而不是按键:),另一个是健壮性/可调试性。忽略你可能拼写错误的论点会导致非常令人沮丧的时刻。最好是将这种东西移到一个单独的层中。

您可以在https://github.com/python-attrs/attrs/wiki/Extensions-to-attrs中找到一些可能的工具。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59993230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档