私はPython 3.6.1、mypy、およびタイピングモジュールを使用しています。私は2つのカスタムタイプ、Foo
とBar
を作成してから、それらを関数から返されたdictで使用しました。この辞書は、str
からUnion
へのマッピングとして、Foo
とBar
と記載されています。Typing.UnionをPythonのサブタイプの1つにキャストする方法は?
process(d["foo"], d["bar"])
# typing-union.py:15: error: Argument 1 to "process" has incompatible type "Union[Foo, Bar]"; expected "Foo"
# typing-union.py:15: error: Argument 2 to "process" has incompatible type "Union[Foo, Bar]"; expected "Bar"
や型を使用して::
-であるように私は、値を使用してみましたfrom typing import Dict, Union, NewType
Foo = NewType("Foo", str)
Bar = NewType("Bar", int)
def get_data() -> Dict[str, Union[Foo, Bar]]:
return {"foo": Foo("one"), "bar": Bar(2)}
def process(foo_value: Foo, bar_value: Bar) -> None:
pass
d = get_data()
:それから私は名前だけ1引数それぞれの機能で、この辞書からの値を使用したいです
process(Foo(d["foo"]), Bar(d["bar"]))
# typing-union.py:20: error: Argument 1 to "Foo" has incompatible type "Union[Foo, Bar]"; expected "str"
# typing-union.py:20: error: Argument 1 to "Bar" has incompatible type "Union[Foo, Bar]"; expected "int"
Union
をそのサブタイプの1つにキャストするにはどうすればよいですか?
ありがとうございます! (a)実際のコードではdictが可変長であるため、(b)私はnamedtupleセマンティクスのファンではありません(例えば、ドットアクセスとアイテムベースのアクセスを混在させる)。 –
@ChrisWarrick:もしあなたが異種の可変長データ構造を持っていれば、名前付きタプルはそれをカットしません。 –