Pythonでラベル名⇔値を相互に取得したいとき、どのように書くのが良いかアドバイスを頂きたいです。
質問の詳細は以下になります。
class Config: label_a: int = 1 label_b: int = 0 label_c: int = -1
上記のようにしておくと、下記のようにして1という値を取得できます。
print(Config.label_a)
そこで逆に、1 という値がわかっているときにラベル名'label_a'を取得できるようにしておきたいのですが、
どのような方法が考えられますでしょうか?
下記のようにディクショナリで持たせておく方法も考えられると思いますが、
もう少しスマートな方法があるかも知れないと思い質問させていただきました。
label_map: Dict[str, str] = { 1: 'label_a', 0: 'label_b', -1: 'label_c', }
また、そもそもConfigクラスで下記のように書いておく方法もあるなとは思いました。
class Config: label2num Dict[str, int] = { 'label_a': 1, 'label_b': 0, 'label_c': -1, } num2label: Dict[int, str] = {v: k for k, v in label2num.items()}
クラス変数として持たせるときに上記がベストであれば私も今後そのようにしたいですが、
実は他の人が最近dataclass.dataclassを多用し始めており、
dataclassでディクショナリを定義しようとするとエラーになるようなので、
どうしようか・・・と考えているうちにわからなくなってきたため
皆さんがどう書くか、どう考えているか、色々な方のご意見を聞いて参考にしたいです。
よろしくお願いします。
追記(2021-11-22)
from dataclasses import dataclass, field from typing import Dict @dataclass(frozen=True) class Config: label_a: int = 1 label_b: int = 0 label_c: int = -1 _labels: Dict[int, str] = field(init=False) def __post_init__(self): object.__setattr__(self, '_labels', {v: k for k, v in vars(self).items()}) def get_label(self, val): return self._labels.get(val) config = Config() print(config.label_a) # 1 print(config._labels) # {1: 'label_a', 0: 'label_b', -1: 'label_c'} print(config.get_label(-1)) # label_c
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/22 03:19
2021/11/22 07:46
2021/11/24 06:17