watakabi
@watakabi

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

pythonで変数の値を関数の名前にしたいです。

Discussion

Closed

解決したいこと

python3で、入力に応じて変数を作るプログラムを作っているのですが、変数の値を関数の名前にしたいです。
調べても自分に理解できる情報が見つからなかったのでここに質問しました。

0

よくわからないのですが、a="func"ということでしょうか?
何か例を出してもらったほうが回答しやすいのではないかと思います

1Like

指定された名前で辞書に格納するとかではだめなんでしょうか?

1Like

locals() が返す辞書に、関数名をキーとして関数オブジェクトをセットすれば関数を定義できます。ただし文脈によっては動かないことがあります。

name = "my_func"

locals()[name] = lambda: print("hello")

my_func() # => hello

exec() を使って動的に関数を定義することもできます。

name = "my_func"

exec(f"""
def {name}():
    print("hello")
""")

my_func() # => hello

いずれにしても、入力に応じて変数や関数の名前を決めるようなコードは普通の Python プログラミングでは書かないほうがいいです。(動的なコード生成が必要なフレームワークを作るときや、 Python で何ができるか実験するときに書く程度です。)なんらかの名前と値を対応させたいときは一般的には辞書オブジェクトを使います。

1Like

すでに同様のコメントついていますが、

入力に応じて変数を作るプログラム
変数の値を関数の名前にしたい

このように動的に変数や関数を作ったり変更したりするのは、技術的な興味ということであればよいのですが、実用的なプログラムを作るには向いていない概念です。

なぜそのようなことがしたいのか説明いただくことはできますか。

ちなみに、pythonであれば、exec()やeval()で実現できます。

1Like

皆様のご回答に感謝いたします。
@calcMCalcm
その通りですね。わかりずらい表現をしていました。
以後はもっと詳しく書くようにします。

@juner
辞書ですか。試してみようと思います。

@uasi
丁寧に二つも例を示してくださり、ありがとうございます。
少々語弊がありましたね。
私が製作していたものは、モールス信号を出力するプログラムなのですが、それぞれの文字の関数を作るためのプログラムを作っていたため、実際に外部からの入力によって関数を実装するプログラムではないのでご心配なく。

@ypsilon-takai
上に同じです。

1Like

一度皆様から得られた情報を試してみようと思います。
本当にありがとうございました。助かりました。

0Like

それぞれの文字の関数を作るためのプログラムを作っていたため

というのは、pythonのソースコードを吐くpythonプログラムということですか?

1Like

そういう構成は変更が面倒などのマイナス面が多くあると思うのですが、そういう構成にすることも目的の一つということでしょうか。
なぜそういう手法にしているのか差し支えなければお聞かせいただけますか。

1Like

初心者とのことですので、今作っておられるものとはかけはなれた構成ですが、興味があったので軽く作ってみました。 (昔ハムだったので。電話級ですが)
参考になれば。

MORSE_TABLE = {
    "":"--・--",
    "":"・-",
    "":"・・-",
    "":"-・---",
    "":"・-・・・"
}
CHAR_SEP = "_"
WORD_SEP = "__"

def morse_code(txt):
    code_list = [morse_code_word(w) for w in txt.split()]
    return WORD_SEP.join(code_list)

def morse_code_word(word):
    code_list = [MORSE_TABLE[c] for c in word]
    return CHAR_SEP.join(code_list)

使うときは以下のようにすると

print(morse_code("アイ イエ イエイ オウ"))

以下のような出力が得られます。

--・--_・-__・-_-・---__・-_-・---_・-__・-・・・_・・-

トン(・)、ツー(ー)、文字間(_)、単語間(__)のようにしてあります。
これで変換したものが表示できますし、こういう文字列を音声に変換する関数を作って渡せば音声にもできます。

1Like

@ypsilon-takai
わざわざコードを書いてくださりありがとうございます。
自分が考えていたものよりもシンプルでいいですね。
参考にさせていただきます。

0Like

Your answer might help someone💌