在Python中使用包名中断枚举比较导入

在Python中使用包名中断枚举比较导入,python,import,enums,package,Python,Import,Enums,Package,我的朋友和我正在用Python制作国际象棋AI,但我们在Enum方面遇到了一个神秘的问题。我们在枚举中对片段类型进行编码,如下所示: Piece.py: from enum import Enum class PieceType(Enum): type_one = 1 ... def recognise_type(my_type): print("Passed ", my_type) if my_type is PieceType.type_one:

我的朋友和我正在用Python制作国际象棋AI,但我们在Enum方面遇到了一个神秘的问题。我们在枚举中对片段类型进行编码,如下所示:

Piece.py:

from enum import Enum

class PieceType(Enum):
    type_one = 1
    ...

def recognise_type(my_type):
    print("Passed ", my_type)

    if my_type is PieceType.type_one:
        print("Type One")
    else:
        print("Type not recognised")
我们向AI索要一件物品(例如,用于推广典当),并称之为“识别”类型:

ai.py:

import Piece

def get_promotion():
    return Piece.PieceType.type_one
bug.py:

import Piece
import ai

my_type = ai.get_promotion()
Piece.recognise_type(my_type)
到目前为止还不错;运行bug.py会输出以下内容:

Passed PieceType.type_one
Type One
但事情是这样的。此包的名称为“Chess”,但如果在ai.py中,我们将
导入棋子
更改为
从Chess导入棋子
(例如,如果我们想将ai.py放在不同的包中),则会出现问题。现在运行bug.py可以提供:

Passed PieceType.type_one
Type not recognised

这里发生了什么事?为什么在import语句中包含包名会破坏枚举比较?

就Python而言,您正在导入不同的模块;你有
Piece
Chess.Piece
。Python将为这两个模块创建单独的模块对象,每个模块都有一个单独的枚举类。这些类上的值永远不会被测试为相等


如果所有模块都是
Chess
包的一部分,则不应将该包中的文件视为顶级模块。这意味着您不应该将该目录添加到Python路径中(通过使用该目录中的脚本显式或隐式)。

为什么要使用
is
进行比较,而不是
=
?@DanielRoseman:因为您。我明白,您是说我们应该使用
国际象棋进行所有导入,这样我们就可以在所有文件中使用相同的模块对象了?@Megdatronica:没错。或者从中使用
。导入工件
以使用相对导入。只有当
Chess/
是Python路径的一部分时,才能导入包中的其他模块,就像它们是顶级包一样。谢谢,这真的很有帮助!