Ответ 1
Это ошибка. Я открыл билет на нем: http://bugs.python.org/issue25665
Проблема заключается в том, что функция namedtuple
при создании класса устанавливает свой атрибут __module__
, просматривая атрибут __name__
от вызова фрейм-глобалы. В этом случае вызывающий объект typing.NamedTuple
.
result.__module__ = _sys._getframe(1).f_globals.get('__name__', '__main__')
Итак, в этом случае он заканчивается как 'typing'
.
>>> type(pt)
<class 'typing.PersonTyping'> # this should be __main__.PersonTyping
>>> type(pc)
<class '__main__.PersonCollections'>
>>> import typing
>>> typing.NamedTuple.__globals__['__name__']
'typing'
Fix:
Вместо этого функция namedtuple
должна сама установить:
def NamedTuple(typename, fields):
fields = [(n, t) for n, t in fields]
cls = collections.namedtuple(typename, [n for n, t in fields])
cls._field_types = dict(fields)
try:
cls.__module__ = sys._getframe(1).f_globals.get('__name__', '__main__')
except (AttributeError, ValueError):
pass
return cls
Теперь вы также можете сделать:
PersonTyping = NamedTuple('PersonTyping', [('firstname',str),('lastname',str)])
PersonTyping.__module__ = __name__