与包装名称破坏枚举比较的进口python[英] Importing with package name breaking enum comparison in Python

问题描述

我和我的朋友在Python中制作国际象棋AI,但是我们遇到了一个神秘的问题.我们在枚举中编码类型,例如:

pice.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询问一块(例如宣传典当)并呼叫识别penise_type:

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

但这是事情.此软件包的名称是"国际象棋",但是如果在ai.py中,我们将import Piece更改为from Chess import Piece(例如,如果我们想将ai.py放在其他软件包中),则出现问题.运行bug.py现在给出:

Passed PieceType.type_one
Type not recognised

这里发生了什么?为什么在"导入语句中断枚举比较"中包括包装名称?

推荐答案

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

如果您的所有模块属于Chess软件包的一部分,则您应该 将该软件包中的文件视为顶级模块.这意味着您不应该将该目录添加到python路径(通过使用该目录中的脚本明确或暗示).

本文地址:https://www.itbaoku.cn/post/2423856.html