Por que devo usar o método __prepare__ para obter o namespace de uma classe?
Nota Esta pergunta não é sobre o Python 3Enum
tipo de dados, é apenas o exemplo que estou usando.
ComPEP 3115 Python 3 adicionou o__prepare__
1 método paratype
com o objetivo de permitir que um espaço para nome personalizado seja usado ao criar classes. Por exemplo, o novoEnum
tipo de dados usa__prepare__
para retornar uma instância do private_EnumDict
para uso como o novoEnum
namespace da classe.
$12 tipo de dados, é apenas o exemplo que estou usando.13$EnumMeta
sendo subclassificado, criando um novo espaço para nome da classe na metaclasse__new__
método, mas em vez de chamar o__prepare__
método para adquirir esse novo espaço para nome,type(clsdict)()
é usado em seu lugar. Existe algum risco em fazê-lo dessa maneira?
1 A assinatura para__prepare__
:
@classmethod
def __prepare__(metacls, cls, bases, **kwds):
e para__new__
:
def __new__(metacls, cls, bases, clsdict, **kwds):
2 Exemplo usandotype(clsdict)
:
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)