Python 3.7类实例的静态字典



我正在重用一个流行的c++习惯用法,其中类包含类实例的静态字典:

class Zzz:
elements = {}
def __init__(self, name):
self._name = name
Zzz.elements[name] = self
@staticmethod
def list_instances():
for k in Zzz.elements.items():
print(k)

在我添加类型注释之前,它一直运行良好,现在python抱怨Zzz是未知类型:名称错误:名称"Zzz"未定义

from typing import Dict
class Zzz:
elements: Dict[str,Zzz] = {} <---- here

您可以转发引用您的类型,将其定义为字符串。

from typing import Dict
class Zzz:
elements: Dict[str, 'Zzz']

Edit顺便说一句,您可以很容易地自动填充这个实现__init_subclass__()方法的静态字典。

class Zzz:
elements: Dict[str, 'Zzz'] = {}
name: str
def __init_subclass__(cls, **kw):
cls.elements[cls.name] = cls
class ZzzImpl(Zzz):
name = 'foo'
assert Zzz.elements['foo'] is ZzzImpl

当注释被"读取"时,Zzz还不存在。Python 3.7仍然在定义时评估注释;在这种情况下,它仍然是未定义的。

这包含在Pep563:中

from __futures__ import annotations

最新更新