【问题标题】:Correctly importing enumerations in Python在 Python 中正确导入枚举
【发布时间】:2020-07-17 07:16:09
【问题描述】:

让我们假设以下情况。在目录./lib 我有文件animal_enum.py (./lib/animal_enum):

from enum import Enum

class Animal(Enum):
    DOG = 1
    CAT = 2
    COW = 3
    
def get_cat():
    return Animal.CAT

在源目录中我有文件./animal_test.py:

def animal_test1():
    from lib.animal_enum import Animal
    from lib.animal_enum import get_cat
    
    print("Results from animal_test1():")
    print(Animal.CAT, get_cat())
    print(Animal.CAT == get_cat())

def animal_test2():
    from lib.animal_enum import Animal
    
    import sys
    sys.path.insert(0, './lib')
    from animal_enum import get_cat
    
    print("Results from animal_test2():")
    print(Animal.CAT, get_cat())
    print(Animal.CAT == get_cat())
    
if __name__ == "__main__":
    animal_test1()
    print('-----')
    animal_test2()

在这两种情况下,枚举都被导入为from lib.animal_enum import Animal。不同之处在于我如何导入函数get_cat()。在函数animal_test1()中直接由from lib.animal_enum import get_cat完成,在函数animal_test2()中将lib目录的路径添加到sys.path变量中,并将方法导入为from animal_enum import get_cat

现在我将值Animal.CAT 与函数get_cat 的结果进行比较,这也是Animal.CAT。我希望这两个比较都是True。但相反,我得到了以下结果:

Results from animal_test1():
Animal.CAT Animal.CAT
True
-----
Results from animal_test2():
Animal.CAT Animal.CAT
False

为什么第二个比较结果为False

PS:防止此错误的一种方法是让动物枚举继承自 intEnum

class Animal(int, Enum):
    DOG = 1
    CAT = 2
    COW = 3

现在,在animal_test 中,比较整数值,结果符合我的预期:

Results from animal_test1():
Animal.CAT Animal.CAT
True
-----
Results from animal_test2():
Animal.CAT Animal.CAT
True

【问题讨论】:

    标签: python import enums enumeration


    【解决方案1】:

    即使您通过不同的方式导入相同的模块,python 也不知道它们是相同的模块。它仍然认为lib.animal_enumanimal_enum 完全不同

    >>> from lib.animal_enum import Animal
    >>> from animal_enum import Animal as Animal2
    >>> 
    >>> Animal == Animal2
    False
    >>> 
    >>> id(Animal)
    94046433019280
    >>> id(Animal2)
    94046433018336
    >>> 
    >>> Animal.__module__
    'lib.animal_enum'
    >>> 
    >>> Animal2.__module__
    'animal_enum'
    >>> 
    

    【讨论】:

    • 感谢您的回答。但是这种行为不会使枚举Animal(Enum) 非常不合适,因为我必须依赖它以相同的方式导入?尤其是在大型项目中,这可能是个问题。
    • 您应该始终使用一致的方式来导入所有模块。如果你要修改sys.path,那应该是你要做的第一件事。也看看@site.addsitedir-docs.python.org/3/library/site.html#site.addsitedir
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    相关资源
    最近更新 更多