gpt4 book ai didi

python - 如何键入使用默认值动态创建的枚举?

转载 作者:行者123 更新时间:2023-12-05 04:19:08 28 4
gpt4 key购买 nike

使用 Functional API我想键入我的枚举,以便它具有默认的已知值。

例子:

class MyBaseClass:
...

class DerivedA(MyBaseClass):
...

class DerivedB(MyBaseClass):
...

DerivedChoice = enum.Enum('DerivedChoice', {cls.__name__: cls for cls in (DerivedA, DerivedB)})


foo: DerivedChoice = DerivedChoice.DerivedB

foo.value # <- this should be `MyBaseClass`

最佳答案

这是一个不错的解决方案

T = TypeVar('T')

if TYPE_CHECKING:
class DefaultEnum(Generic[T], enum.Enum): # this class does not exist at runtime
@property
def value(self) -> T:
...

def default_enum(name: str, members: dict[str, T], type: T) -> 'DefaultEnum[T]':
return enum.Enum(name, members) # type: ignore

用法:

class MyBase:
foo: int
bar: str


class A(MyBase):
...


class B(MyBase):
...

MyBaseDerived = default_enum(name='MyBaseDerived',
members={cls.__name__: cls for cls in (A, B)},
type=MyBase)

MyBaseDerived.value.foo # <- hinted by PyCharm

编辑:

这个似乎适用于 VSCode

from typing import Generic, TypeVar, TYPE_CHECKING

T = TypeVar('T')

if TYPE_CHECKING:
import enum
from dataclasses import dataclass


class EnumProperty(Generic[T]):
name: str
value: T


class DefaultEnum(Generic[T]): # this class does not exist at runtime
def __getattribute__(self, item) -> 'EnumProperty[T]':
...


def default_enum(name: str, members: dict[str, T], type: T) -> 'DefaultEnum[T]':
return enum.Enum(name, members) # type: ignore

关于python - 如何键入使用默认值动态创建的枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74949000/

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