簡體   English   中英

Dataclass 屬性的 Python 類型提示注釋

[英]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

我想用這個例子展示兩件事:

  1. 如果您只是比較枚舉,則根本不需要.value
  2. 您甚至不需要手動為枚舉賦值; 您可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM