gpt4 book ai didi

python - Cython 中的重复枚举成员名称 - 重新声明错误?

转载 作者:太空宇宙 更新时间:2023-11-04 04:40:59 26 4
gpt4 key购买 nike

Cython 似乎不允许我重复使用枚举成员名称。

我有以下枚举,我正在尝试对其进行 cythonize:

from enum import Enum

class Fruit(Enum):

UNKNOWN = 0
APPLE = 1
ORANGE = 2

class Animal(Enum):

UNKNOWN = 0
DOG = 1
CAT = 2

但以下结果导致 'UNKNOWN' redeclared 编译错误:

cpdef enum Fruit:

UNKNOWN = 0
APPLE = 1
ORANGE = 2

cpdef enum Animal:

UNKNOWN = 0
DOG = 1
CAT =

我应该如何解决上述问题?

此外,理想情况下,我希望使用 NULL 作为枚举成员名称,而不是 UNKNOWN。但似乎 NULL 是 Cython 的特权关键字,尽管它不适用于 CPython。有什么解决方法吗?

最佳答案

在 C 中,以下代码 would not compile :

enum Foo{
A
};

enum Bar{
A
};

因为在 C 中,枚举不会引入新的名称范围,因此如果您对两种类型 Foo 使用相同的标识符 A 就会发生名称冲突栏.

Cython 将翻译(如果它只是应用其通常的方案而不因编译器错误而停止):

#foo.pyx
cpdef enum Fruit:
UNKNOWN = 0

cpdef enum Animal:
UNKNOWN = 0

类似于

enum __pyx_t_3foo_Fruit {
__pyx_e_3foo_UNKNOWN = 0
};

enum __pyx_t_3foo_Animal {
__pyx_e_3foo_UNKNOWN = 0
};

正如我们所见,这不是有效的 C,因此 Cython 的选择是生成错误。一个“问题”是 Cython 没有将类型名称(FruitAnimal)包含到生成的枚举值名称中,因此在 Cython 中您可以为了将它们区分为 Fruit.UNKNOWNAnimal.UNKNOWN,它们将映射到相同的 C 标识符。

至少有两种选择:

A: C 中通常的策略是使用前缀来区分枚举,例如:

cpdef enum Fruit:
FRUIT_UNKNOWN = 0

cpdef enum Animal:
ANIMAL_UNKNOWN = 1

或 B:您可以让 Cython 通过将它们放入不同的 pxd 文件中来完成这项工作,这些文件将导入到生成的 pyx 文件中:

# Fruit.pxd
cpdef enum Fruit:
UNKNOWN = 0

#Animal.pxd
cpdef enum Animal:
UNKNOWN = 0

# foo.pyx:
cimport Fruit
cimport Animal

# use Fruit.UNKNOWN and Animal.UNKNOWN

在生成的代码中,枚举名称将具有模块名称(即 FruitAnimal),因此从 C 编译器的角度来看是不同的.

关于python - Cython 中的重复枚举成员名称 - 重新声明错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50653853/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com