使Python枚举对交互式工作安全,在这种工作中可以多次执行文件

使Python枚举对交互式工作安全,在这种工作中可以多次执行文件,python,enums,singleton,metaprogramming,python-interactive,Python,Enums,Singleton,Metaprogramming,Python Interactive,如果我在用Python进行交互式工作,并且有一个Enum,看起来像这样 from enum import Enum class UnsafeColor(Enum): RED = 1 GREEN = 2 BLUE = 3 我可以 [In]: socks = UnsafeColor.RED <rerun file> [In]: shoes = UnsafeColor.RED [In]: socks == shoes [Out]: False 现在,以下工

如果我在用Python进行交互式工作,并且有一个
Enum
,看起来像这样

from enum import Enum
class UnsafeColor(Enum):
     RED = 1
     GREEN = 2
     BLUE = 3
我可以

[In]: socks = UnsafeColor.RED
<rerun file>
[In]: shoes = UnsafeColor.RED
[In]: socks == shoes
[Out]: False
现在,以下工作如预期:

[In]: hat = SafeColor.RED
<rerun file>
[In]: shirt = SafeColor.RED
[In]: hat == shirt
[Out]: True
[In]:hat=SafeColor.RED
[In]:衬衫=SafeColor.RED
帽子=衬衫
是的

这是可行的,但不会赢得任何奖项。
Enum中似乎有很多单例和元类魔法,所以我想知道,有没有更好的方法来实现这一点?

您遇到的问题是
步骤。在Python2中,它是一个内置的拼写为
reload()
,而在Python3中,它被隐藏在一个模块中,因为它是一个吸引人的讨厌的东西——这正是您上面所说的原因

Python的设计目的不是让任何模块“重新运行”,您会发现,在重新运行之前保存的每个带有单例的模块(如上面的袜子)都会在新的重新运行文件(上面的鞋子)中有副本

换句话说,这不是枚举问题,而是Python的设计方式。如果重新运行模块,请注意更新以前保存的任何内容—模块变量、函数、类和单例


添加一些希望有用的建议——将您的常量和不需要重新加载的内容保存在它们自己的文件中;重新运行
get时,它仍将导入已运行和不再运行的常量文件,并且您的枚举和其他常量将相同。

我使用Spyder中的
执行此
业务。您的建议听起来像是一种处理此问题的实用方法,它比创建一个特殊的
Enum
变量要简单。
[In]: hat = SafeColor.RED
<rerun file>
[In]: shirt = SafeColor.RED
[In]: hat == shirt
[Out]: True