如何解决具有可写属性的类型的 Python 注释
我有一个函数可以将一个名为 .addr
的属性粘贴到对象上,类似这样(简化):
def add_addr(x: Any,stuff):
object.__setattr__(x,'addr',make_addr_from(stuff))
(是的,这甚至修改了不可变对象。)
这意味着 x
不能是原始类型,例如 int
或 str
。因此,Any
不是 x
的合适类型注释。 x
的合适类型注释是什么?
解决方法
它也适用于原始类型,但您必须创建派生类,因为内置类的属性集有限。这也适用于列表、元组和字典等结构化类型。
class MyInt (int):
pass
i = MyInt(42)
add_addr(i,whatever)
就注释而言,我认为创建一个抽象类作为允许使用 add_addr
设置属性的对象的基础,并将该基类用于注释是有意义的.
为了类型注释的目的,恐怕没有其他方法可以区分内置类和派生类。
或者,保留 Any
注释,并在函数内部使用 try...except AttributeError
子句。
Python typing
系统无法注释“任何 .addr
可写的对象”。使用一些已知兼容的特定对象对 x
进行注释,或者使用 Protocol
进行读/写 .addr
。
如果该函数仅用于某些有意使用它的特定对象,请对其进行注释:
from typing import Any
class Foo:
"""Type with writeable `__dict__`"""
pass
def add_addr(x: Foo,stuff: Any):
object.__setattr__(x,'addr',stuff)
add_addr(Foo(),2)
在这种情况下,MyPy 相信您 Foo
可以使用该函数。这并没有说明可能或可能不适用于该函数的其他类型。
如果该函数旨在用于可证明兼容的任何对象,请为所需功能定义一个 Protocol
:
from typing import Any,Protocol
class RWAddr(Protocol):
"""The structural type of 'asnything with read/write `.addr`'"""
addr: Any # note: could also use a property/setter pair
class Bar:
"""Type with writeable `.addr` and other stuff"""
addr: Any
port: int
def add_addr(x: RWAddr,stuff)
add_addr(Bar(),2)
在这种情况下,MyPy 将验证参数满足协议。这意味着 MyPy 必须主动知道一个类型有一个可写的 .addr
——例如,之前的 Foo
不满足这一点。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。