簡體   English   中英

如何使用類型提示注釋只寫屬性

[英]How to annotate a write-only property using type hints

我想要一個只寫屬性,當有人更改它時通知我。 此外,我必須重新分配名稱(此處為var ),以免在類的命名空間中有額外的名稱。 這違反了 Mypy 規則。

這是簡化版:

class A:
    def var(self, value):
        print("value changed:", value)

    var = property(fset=var)


obj = A()
obj.var = 10
obj.var = "hi"

Mypy 錯誤信息:

main.py:5: error: Incompatible types in assignment (expression has type "property", variable has type "Callable[[A, Any], Any]")
main.py:9: error: Cannot assign to a method
main.py:9: error: Incompatible types in assignment (expression has type "int", variable has type "Callable[[Any], Any]")
main.py:10: error: Cannot assign to a method
main.py:10: error: Incompatible types in assignment (expression has type "str", variable has type "Callable[[Any], Any]")
Found 5 errors in 1 file (checked 1 source file)

如何在不使用# type: ignore抑制錯誤的情況下讓 Mypy 開心?

我目前解決它的嘗試是:

class A:
    def temp(self, value):
        print("value changed:", value)

    var = property(fset=temp)
    del temp


obj = A()
obj.var = 10
obj.var = "hi"

有沒有更好的辦法?

似乎沒有其他辦法,Mypy 不允許我在類主體中重新定義名稱。 類變量可以,但方法不行。

雖然我可以使用我在問題中展示的臨時方法,但我更喜歡使用帶有 getter 和 setter 的@property裝飾器定義屬性並手動提高AttributeError

class A:
    @property
    def var(self):
        raise AttributeError("unreadable attribute 'var'")

    @var.setter
    def var(self, value):
        print("value changed:", value)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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