Python:初始化在初始化之前导入的变量(枚举)的正确方法是什么

时间:2017-08-22 17:03:14

标签: python types initialization backend lazy-evaluation

我正在编写一些使用后端服务的客户端代码来获取它使用的一些类型。

某些类型将使用代码中的Enum来表示。但是,这些枚举在初始化之前会被导入到文件中。

这是一个类似于我的代码的例子:

types.py

EnumA = None
EnumB = None

update_types():
    global EnumA
    global EnumB
    backend_types = get_backend_types(...)
    EnumA = Enum("A", backend_types["A"])
    EnumB = Enum("B", backend_types["B"])

client.py

from types import EnumA, EnumB, update_types

class Client:
    def setup(...):
        update_types()

    def some_method():
        # uses the enums here
        a = EnumA(1)

Client.setup()很早就被召唤,但还不够早。

问题在于,当我执行some_method时,EnumA仍然是None而不是从后端初始化。

some_method中添加本地导入可以解决这个问题,但我想找到更通用的解决方案。

1 个答案:

答案 0 :(得分:0)

您有两个选择:

  • 导入模块而不是部件:
      import types
      ...
      a = types.EnumA(1)
  • 将对get_backend_types()Enum创建的调用移至模块级别,而不是将它们隐藏在函数中:
      from enum import Enum
      ...
      backend_types = get_backend_types(...)
      EnumA = Enum("A", backend_types["A"])
      EnumB = Enum("B", backend_types["B"])