【Python】 Python ~ 基本編 / ジェネリック ~

■ はじめに

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