亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

嵌套字典上的參數太多或太少

嵌套字典上的參數太多或太少

弒天下 2023-07-11 17:11:00
dict我正在嘗試在具有多個將函數綁定到它們的字段的類型中添加類型提示。例如from typing import Dict, Callable, Any, Uniondef fn():  print("Hello World")def fn2(name):   print("goodbye world", name)d = {  "hello" : {    "world": fn  },  "goodbye": {    "world": fn2  }} # type: Dict[str, Dict[str, Union[Callable[[], None], Callable[[str], None]]]]d["hello"]["world"]()d["goodbye"]["world"]("john")我遇到的問題是每當我嘗試運行mypy(v0.782)時它都會拋出錯誤:test2.py:17: error: Too few argumentstest2.py:18: error: Too many arguments顯然,從函數定義和類型提示中可以看出,我已經傳遞了正確的參數。我顯然錯過了一些東西,導致它拋出錯誤。Union但是,以下內容有效,所以我懷疑它與輸入類型提示有關。from typing import Dict, Callable, Any, Uniondef fn():    print("Hello World")d = {"hello": {"world": fn}}  # type: Dict[str, Dict[str, Callable[[], None]]]d["hello"]["world"]()
查看完整描述

1 回答

?
寶慕林4294392

TA貢獻2021條經驗 獲得超8個贊

讓我提醒您,當使用 時未考慮以下約束時,就會出現問題中描述的問題Union

僅當操作對每個聯合項都有效時,它們才對聯合類型有效。這就是為什么通常需要使用isinstance()檢查來首先將聯合類型縮小為非聯合類型。這也意味著建議避免使用union類型作為函數返回類型,因為調用者可能必須isinstance()在對值進行任何有趣的操作之前使用。[1]

作為解決方法,我建議使用帶有可選參數的單個函數。我用來Protocol定義帶有可選參數的回調類型,該參數無法使用Callable[...]

from typing import Protocol, Optional, Dict



class Fn(Protocol):

    def __call__(self, name: Optional[str] = None) -> None:

        ...



def fn(name: Optional[str] = None) -> None:

    if name is None:

        print("Hello World")

    else:

        print("goodbye world", name)



d: Dict[str, Dict[str, Fn]] = {

    "hello": {

        "world": fn

    },

    "goodbye": {

        "world": fn

    }

}


d["hello"]["world"]()

d["goodbye"]["world"]("john")

[1] https://mypy.readthedocs.io/en/stable/kinds_of_types.html#union-types


查看完整回答
反對 回復 2023-07-11
  • 1 回答
  • 0 關注
  • 153 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號