python-3.x - Python:伪枚举 - 作为枚举的类 - 如何避免循环导入
问题描述
我想在我的 python 项目中创建一个伪枚举。这些值实际上是类。
# file my_enums.py
import MyClass1
import MyClass2
import MyClass3
class MyEnum:
MY_CLASS_1 = MyClass1
MY_CLASS_2 = MyClass2
MY_CLASS_3 = MyClass3
# file my_class1.py
import MyEnum
class MyClass1:
def foo(self, x):
print(isinstance(x, MyEnum.MY_CLASS_2))
这样做会导致循环导入错误。我希望能够在 isinstance 函数中使用 MyEnum 值,并将枚举导入到定义其中一些类的模块中。有没有办法这样做?
解决方案:
# file my_enums.py
import MyClass1
import MyClass2
import MyClass3
class MyEnum:
MY_CLASS_1 = None
MY_CLASS_2 = None
MY_CLASS_3 = None
@classmethod
def define(cls):
cls.MY_CLASS_1 = MyClass1
MyEnum.define()
解决方案
要记住的是,当一个模块被加载时,它会被执行——但只有顶级语句和顶级类的直接内部;函数和方法的主体在实际调用之前不会被评估。
# example module
CONSTANT = 7 # top-level, executed
def a_func(value=CONSTANT): # top-level, executed
return value + 9 # body, not executed
class a_class(metaclass=SomeMeta): # top-level, executed (and error as SomeMeta
# has not been defined nor imported)
CLS_CONSTANT = 3 # top-level class body, executed
def a_method(self): # executed
return self.CLS_CONSTANT + FUTURE_CONSTANT # method body, not executed
FUTURE_CONSTANT = 11
因此,在您的示例中,您需要确保并且不使用将在导入期间执行的MyEnum
任何地方my_class1.py
,并将导入放在my_enums.py
最后 - 然后my_enums.py
在其导入期间执行时,它将能够导入my_class1
哪个点,定义类。
推荐阅读
- javascript - API 查克诺里斯笑话未定义
- flutter - 颤振:使用底部导航栏实现内部导航的最佳方式
- javascript - 使用 Graalvm js-engine 将 js 外部库添加到嵌入式 Camunda
- typescript - 如何使用 TypeScript 在 Heremap 中使圆圈可拖动?
- python - GraphViz 的可执行文件在 Anaconda 中找不到错误?
- jsf - JSF 2.3.15 Mojarra:Websocket 尝试无限地重新连接而不是有限地重新连接
- cypress - 运行 npx cypress 时如何修复 Unexpected token {?
- yii2 - Yii2 视图在 Windows 中正确渲染,但在 MAC 上不正确
- json - 使用 Powershell 从 json 获取动态键值
- javascript - 如何从数组中过滤数组