[英]Python type hinting annotation for Dataclass attribute
我有一個dataclass
,我將它用作常量存儲。
@dataclass
class MyClass:
CONSTANT_1 = "first"
CONSTANT_2 = "second"
我有一個功能:
def my_func(value: ?):
print(value)
我想在我的函數中添加注釋以指定可能的值是MyClass的屬性之一
怎么做(我使用的是python 3.10)?
希望我不會誤解這個問題,如果有,請告訴我。 但我認為在這種情況下最好在 python 中使用Enum
類型。
這是一個簡單的例子:
from enum import Enum
class MyEnum(Enum):
CONSTANT_1 = "first"
CONSTANT_2 = "second"
然后回答第二部分,用於注釋?
變成一個MyEnum
。 這意味着此類型的任何枚舉成員,但不是類型(類)本身。
def my_func(value: MyEnum):
print(value, value.name, value.value)
把它們放在一起,它變成了:
from enum import Enum
class MyEnum(Enum):
CONSTANT_1 = "first"
CONSTANT_2 = "second"
def my_func(value: MyEnum):
# technically you can remove this check
if not isinstance(value, MyEnum):
return
print(value, value.name, value.value)
# note below: only type checker or ide complain, but code still runs fine
my_func('hello') # not OK!
my_func('second') # not OK!
my_func(MyEnum) # not OK!
my_func(MyEnum.CONSTANT_1) # OK
我想你在問一個XY 問題。 從您在評論中的回復來看,您想要的似乎是:
正如 rv.kvetch 的回答中提到的,這樣做的傳統方法是使用枚舉。 我不確定您所說的“想要跳過.value
”是什么意思,枚舉的value
字段只是為您提供了與該枚舉相關的內容,我想說這根本不重要。 這是一個例子:
class StrEnum(enum.Enum):
FIRST = "first"
SECOND = "second"
class StrEnum2(enum.Enum):
FIRST = "first"
SECOND = "second"
print(StrEnum.FIRST.value) # first
print(StrEnum2.FIRST.value) # first
print(StrEnum.FIRST.value == StrEnum2.FIRST.value) # True
print(StrEnum.FIRST == StrEnum2.FIRST) # False
class IntEnum(enum.Enum):
FIRST = enum.auto()
SECOND = enum.auto()
print(IntEnum.FIRST.value) # 1
print(IntEnum.SECOND.value) # 2
我想用這個例子展示兩件事:
.value
。enum.auto()
自動為其分配唯一值。因為歸根結底,枚舉本身已經代表了有效選擇中的一個選擇,所以它有什么值並不重要。
也就是說,如果您想要的只是對參數可以輸入的值施加類型約束,而不必使用枚舉,那么您可以使用Literal
類型。 有關詳細信息,請參閱此答案。 對於您的示例,您可以執行以下操作:
from typing import Literal, Final
def my_func(value: Literal["first", "second"]):
print(value)
my_func("first") # ok
my_func("not first") # bad
x = "first"
y: Final = "first"
my_func(x) # bad, because `x` is not final
my_func(y) # ok
但請注意,類型注釋並不能真正阻止您調用具有無效值的函數,它只是 IDE 和類型檢查器的提示。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.