首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用attr.validators.optional

如何使用attr.validators.optional
EN

Stack Overflow用户
提问于 2019-02-07 09:28:59
回答 1查看 5.6K关注 0票数 2

按照attrs文档,可选属性应声明如下:

代码语言:javascript
复制
>>> @attr.s
... class C(object):
...     x = attr.ib(validator=attr.validators.optional(attr.validators.instance_of(int)))
>>> C(42)
C(x=42)
>>> C("42")
Traceback (most recent call last):
   ...
TypeError: ("'x' must be <type 'int'> (got '42' that is a <type 'str'>).", Attribute(name='x', default=NOTHING, validator=<instance_of validator for type <type 'int'>>, type=None, kw_only=False), <type 'int'>, '42')
>>> C(None)
C(x=None)

但是,当我尝试使用可选属性时,会得到以下结果:

代码语言:javascript
复制
python
Python 2.7.15 (default, Jul 23 2018, 21:27:06)
[GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.2)] on darwin

具有强制属性的

类定义

代码语言:javascript
复制
>>> import attr
>>> @attr.s
... class Result(object):
...   log = attr.ib(validator=attr.validators.instance_of(str))
...

类实例化

缺少属性

代码语言:javascript
复制
>>> test = Result()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __init__() takes exactly 2 arguments (1 given)

好的

具有无效类型

代码语言:javascript
复制
>>> test = Result(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<attrs generated init 086c7a4a2a56d2e9002255c4e881a832c6bc5360>", line 4, in __init__
  File "/.../.venv/lib/python2.7/site-packages/attr/validators.py", line 32, in __call__
    value,
TypeError: ("'log' must be <type 'str'> (got 1 that is a <type 'int'>).", Attribute(name='log', default=NOTHING, validator=<instance_of validator for type <type 'str'>>, repr=True, cmp=True, hash=None, init=True, metadata=mappingproxy({}), type=None, converter=None, kw_only=False), <type 'str'>, 1)

好的

具有正确的类型

代码语言:javascript
复制
>>> test = Result('aaa')
>>> test.log
'aaa'

好的

具有可选属性的

类定义

代码语言:javascript
复制
>>> import attr
>>> @attr.s
... class Result(object):
...   log = attr.ib(validator=attr.validators.optional(attr.validators.instance_of(str)))
...

类实例化

缺少属性

代码语言:javascript
复制
>>> test = Result()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __init__() takes exactly 2 arguments (1 given)

KO

具有无效类型

代码语言:javascript
复制
>>> test = Result(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<attrs generated init 7e2ff957cec78e81193f38c89e2f4eb2ff2dad4e>", line 4, in __init__
  File "/.../.venv/lib/python2.7/site-packages/attr/validators.py", line 106, in __call__
    self.validator(inst, attr, value)
  File "/.../.venv/lib/python2.7/site-packages/attr/validators.py", line 32, in __call__
    value,
TypeError: ("'log' must be <type 'str'> (got 1 that is a <type 'int'>).", Attribute(name='log', default=NOTHING, validator=<optional validator for <instance_of validator for type <type 'str'>> or None>, repr=True, cmp=True, hash=None, init=True, metadata=mappingproxy({}), type=None, converter=None, kw_only=False), <type 'str'>, 1)

好的

具有正确的类型

代码语言:javascript
复制
>>> test = Result('aaa')
>>> test.log
'aaa'

好的

我使用可选属性做错了什么?我的误解在哪里?

EN

回答 1

Stack Overflow用户

发布于 2019-02-07 10:07:24

正确的类定义是:

代码语言:javascript
复制
>>> @attr.s
... class Result(object):
...   log = attr.ib(default=None, validator=attr.validators.optional(attr.validators.instance_of(str)))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54570103

复制
相关文章

相似问题

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