Документально подтверждено, что порядок определения в классах сохраняется (см. также PEP 520):
Если у метакласса нет атрибута
__prepare__
, то пространство имен класса инициализируется как пустое упорядоченное отображение.
Сохраняется ли порядок определения в объектах модуля?
# foo_bar.py
def foo():
pass
def bar():
pass
Я экспериментировал с модулем выше (также меняя порядок), и он показался надежным:
>>> import foo_bar
>>> for name in foo_bar.__dict__:
... if not name.startswith('_'):
... print(name)
...
foo
bar
Предположительно, пространство имен модулей также использует компактный словарь внизу, или, возможно, из того факта, что type(foo_bar)
является <class 'module'>
, следует, что он также должен соблюдать порядок определения, как и любой другой класс. Однако я не уверен, является ли это функцией, гарантированной Python, или просто деталью реализации CPython. Должны ли имена в модулях соблюдать порядок определений?
foo_bar
не является классом. Вы, кажется, запутались в том, какtype(foo_bar)
имеетclass
в выводе.class
в выводе просто означает, чтоtype(foo_bar)
— это класс; это не значит, чтоfoo_bar
сам по себе один. - person user2357112 supports Monica   schedule 16.03.2017ModuleType
. - person wim   schedule 16.03.2017__dict__
. Это все еще деталь реализации. - person user2357112 supports Monica   schedule 16.03.2017