簡體   English   中英

在python中將Callable鍵入特定的方法

[英]Typing Callable in python to specific methods

我試圖對輸入進行非常嚴格的操作,但是我只想用幾種非常特定的方法來鍵入Callable時遇到一個問題!

我有一堂課:

class Complex:

    def __add__(self, other):
        return Complex()

    def __sub__(self, other):
        return Complex()

    def __div__(self, other):
        return Complex()

在另一個文件中,我想編寫一個接受Callable的方法,但是該方法的參數只能是add函數或sub函數。 這意味着如果我嘗試將div作為函數傳遞給test_add_sub(),我希望linter引發錯誤。

下面的代碼似乎不起作用:(當我將div函數傳遞給test_add_sub時,lint或編譯器都會抱怨!也無法編寫Complex.complex_func()。

    add_sub_type = Complex.__add__ or Complex.__sub__
    add_sub_type2 = Callable[[Complex.__add__ or Complex.__sub__], None]


    def test_add_sub(complex_func: add_sub_type) -> None:
        print(complex_func)
        Complex.complex_func() <-- 'Class Complex has no complex_func member'

預先非常感謝大家。

typing不能做到這一點。 靜態偽類型系統不允許您定義具有任意成員集的類型。 (此外, Complex.complex_func()也不是您如何調用complex_func的方法。)

如果您確實希望對此進行基於類型的靜態檢查,則可以使用枚舉代替方法:

class ComplexAddSub(enum.Enum):
    add = Complex.__add__
    sub = Complex.__sub__

    def __call__(self, left: Complex, right: Complex):
        return self.value(left, right)

def whatever(func: ComplexAddSub):
    func(Complex(), Complex())

whatever(ComplexAddSub.add)

運行時檢測

def test_add_sub(complex_func):
    tester = {Complex.__addr__: False, Complex.__sub__: False}
    if (tester.get(complex_func, True)):
        raise RuntimeError('Invalid argument!')

    #complex_func(some_complex_object, another_complex_object)

在此處閱讀有關實例方法的更多信息。

暫無
暫無

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

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