【发布时间】:2022-01-20 00:04:29
【问题描述】:
如果没有提供 UUID,则默认生成 UUID 的类,如果提供 str,则验证/创建 UUID 对象。
import attr
from attrs import validators
from uuid import UUID, uuid1
def _validate(instance, attribute, value) -> None:
try:
if isinstance(value, str):
instance.uuid = UUID(value)
return
except Exception as e:
raise BadUUID() from e
@attr.s(slots=True)
class Private:
uuid = attr.ib(type=[str, UUID], validator=[validators.optional([validators.instance_of(UUID), validators.instance_of(str)]), _validate], default=uuid1())
它应该有和没有提供一个值:
print(Private())
print(Private('d283a713-9f4b-1c15-ab8d-8d95d7ce8999'))
如果没有提供它应该使用默认设置生成一个新的 UUID。
如果提供了值,则应对其进行验证并创建一个 UUID 对象。
我收到一个错误,因为它只会验证一种实例类型,str 或 UUID。
如果我设置instance_of(UUID),它只会在不提供值的情况下工作。
如果我将其设置为 instance_of(str),它只会在提供 str 时起作用。
我做错了什么,有没有更好的方法来完成我正在寻找的东西?
【问题讨论】:
-
为什么
_validate传递给attribute?如果value不是字符串会发生什么,目前它只是返回而没有变化? -
@Grismar 我没有使用
attribute,就像在文档中那样。Private只能以str或为空来启动。如果它以str启动,那么它应该通过_validate。如果Private初始化为空,它应该求助于default=uuid1(),它返回一个UUID对象。我不确定instance.uuid = UUID(value)是否是正确的设置方式。 -
@Grismar 这就是我想出的,对吗?
def _validate(inst, attr, value) -> None: print('---- validate') if isinstance(value, str): try: object.__setattr__(inst, 'uuid', UUID(value)) except Exception as e: raise BadUUID() from e @attr.s(slots=True, frozen=True) class Private: uuid = attr.ib( type=(str, UUID), validator=validators.optional([validators.instance_of((str, UUID)), _validate]), default=uuid1() ) -
不要在 cmets 中发布代码,如果您认为自己更接近答案,请添加到您的问题中,但提供的答案尚不正确。
标签: python python-3.x python-attrs