Как я могу получить "строчное" пространство имен с cls .__ members__ для работы? - PullRequest
0 голосов
/ 28 декабря 2018

Итак, я написал этот модуль:

plaform.py

from enum import IntFlag

class PlatformFlag(IntFlag):
    LINUX = 1,
    MACOSX = 2,
    WINDOWS = 3
globals().update(PlatformFlag.__members__)

И я пытаюсь использовать его следующим образом:

import platform

if __name__ == '__main__':
    if platform.WINDOWS:
        print("This is Windows!")

Однако я получаю:

"Произошло исключение: у модуля AttributeError" платформа "нет атрибута" WINDOWS ""

Это работает:

import platform

if __name__ == '__main__':
    if platform.PlatformFlag.WINDOWS:
        print("This is Windows!")

Однако, НЕ желаемый способ сделать это .Я думаю о re.py в cPython.Они могут вызвать это, например, re.compile (pattern, flags = re.M) .Однако, по какой-то неизвестной мне причине, globals (). Upate () , похоже, не работает, или я что-то здесь упускаю.

Re.py:

https://github.com/python/cpython/blob/master/Lib/re.py

РЕДАКТИРОВАТЬ: Это заслуживает доверия, https://repl.it/@JoranBeasley/IntentionalPastStrategies

1 Ответ

0 голосов
/ 28 декабря 2018

Проблема, с которой вы столкнулись, связана с именованием, поскольку существует встроенный модуль, называемый платформой.

https://docs.python.org/3.7/library/platform.html

Запуск кода с другим именем, например platform123.py, работает.Однако функциональность, позволяющая определить, какая операционная система работает, не является частью вашего кода и, как таковая, не работает:)

Способ работы RE состоит в том, чтобы принимать флаги в качестве входных данных для функций.Функция globals (). Update (xx .__ members__) делает члены классов доступными только в глобальном пространстве имен, поэтому вы можете использовать platform.WINDOWS вместо platform.PlatformFlag.WINDOWS.

...