注意這個問題不是關於Python 3 Enum
數據類型,它只是我正在使用的示例。爲什麼我應該使用__prepare__方法來獲得類的名稱空間?
PEP 3115隨着Python 3的添加__prepare__
方法type
用於允許創建類時使用的自定義名稱空間的目的。例如,新的Enum
數據類型使用__prepare__
返回專用_EnumDict
的實例,以用作新的Enum
類的名稱空間。
然而,我看到的幾個例子對SO的EnumMeta
被子類,創建用於在元類__new__
方法的類新的命名空間,但是,而不是調用__prepare__
方法,以獲取新的命名空間,則使用type(clsdict)()
代替。這樣做有風險嗎?
爲__prepare__
簽名:
def __new__(metacls, cls, bases, clsdict, **kwds):
實施例使用type(clsdict)
:
@classmethod
def __prepare__(metacls, cls, bases, **kwds):
和__new__
class CountryCodeMeta(enum.EnumMeta):
def __new__(metacls, cls, bases, classdict):
data = classdict['data']
names = [(country['alpha-2'], int(country['country-code'])) for country in data]
--> temp = type(classdict)()
for name, value in names:
temp[name] = value
excluded = set(temp) | set(('data',))
temp.update(item for item in classdict.items() if item[0] not in excluded)
return super(CountryCodeMeta, metacls).__new__(metacls, cls, bases, temp)