■ はじめに
Java / C# のジェネリックを使ったコードを、 Pythonで書きたかったので、調べてみた。
■ サンプル
例1、例2いずれも実行できてしまう
例1
from typing import List value_list: List[str] = [] value_list.append("Hello") value_list.append("World") value_list.append(1) for value in value_list: print(value)
出力結果
Hello World 1
例2
from typing import Sequence, TypeVar T = TypeVar('T') def print_list(input_list: Sequence[T]): for input_value in input_list: print(input_value) print_list(['Hello', 'World']) print_list(['Hello', 123]) E = TypeVar('AnyStr', str, float) def print2_list(input_list: Sequence[T]): for input_value in input_list: print(input_value) print2_list(['Hello', 'World']) print2_list(['Hello', 123]) print2_list(['Hello', 123.11])
出力結果
Hello World Hello 123 Hello World Hello 123 Hello 123.11
■ ジェネリック的な書き方をPythonでしてみる
こっちが本題。 以下「イメージ(Java)」のようなものをPythonで書く
イメージ(Java)
// あくまで、イメージ private Map<string, object> mapper; public getValueByKey<T>(string key, T defalutValue = null) { if (this.mapper.containsKey()) { return (T) this.mapper.get(key); } else { return defalutValue; } }
サンプル(Python)
sample_dict = { "key001": "Hello", "key002": "World", "key003": 123, "key004": 456.12, } def get_value_by_key(target_key, data_type=str, default_value=None): if target_key in sample_dict: return data_type (sample_dict[target_key]) else: return default_value print("[1] {}".format(get_value_by_key("key001"))) print("[2] {}".format(get_value_by_key("key002"))) print("[3] {}".format(get_value_by_key("key003", int, 100))) print("[4] {}".format(get_value_by_key("keyX03", int, 100))) print("[5] {}".format(get_value_by_key("key004", float, 200.01))) print("[6] {}".format(get_value_by_key("key004", int, 200))) print("[7] {}".format(get_value_by_key("keyX04", float, 200.01))) print("[8] {}".format(get_value_by_key("key003", int) + get_value_by_key("key004", float))) print("[9] {}".format(get_value_by_key("keyXXX")))
出力結果
[1] Hello [2] World [3] 123 [4] 100 [5] 456.12 [6] 456 [7] 200.01 [8] 579.12 [9] None
関連記事
Python ~ 基本編 / 文字列 ~
https://dk521123.hatenablog.com/entry/2019/10/12/075251