質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

3回答

402閲覧

python 引数の名前を取得したい

ngmg

総合スコア72

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

1グッド

0クリップ

投稿2022/09/23 12:58

編集2022/09/24 18:39

前提

tmpディレクトリにsuugaku.jsonとeigo.jsonがあります。

実現したいこと

tmpディレクトリに辞書のjsonがあります。
再起動などで辞書が空になった時にそのjsonから辞書のデータを取得したいと思っています。
しかしjsonファイルを取得する際、引数から名前を取得できれば一番よいのですが何か方法はないでしょうか。
ソースでは辞書の値が取得されているということは理解しています。

発生している問題・エラーメッセージ

TypeError: can only concatenate str (not "dict") to str

該当のソースコード

suugaku = {} eigo = {} async def main(): dictional = { '数学': suugaku, '英語': eigo, } for title, dic in dictional.items(): fetch(title, dic) async def fetch(title, dic): if any(dic) == False: with open("tmp/"+dic+".json", mode='r', encoding='utf-8') as f: dic = json.load(f) print(dic)
spoofy_dragon😄を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shiracamus

2022/09/23 13:55

具体的に、ファイル名は何にしたいのですか?
melian

2022/09/23 14:06

dictional = { '数学': 'suugaku', '英語': 'eigo', } として、if any(dic) == False: 以降をファイルの存在をチェックする処理に書き換えるとよいのではないでしょうか。
TakaiY

2022/09/23 14:35 編集

(削除しました)
guest

回答3

0

ベストアンサー

通常の方法では、変数名そのものや引数名や仮引数名を処理の中で対象とすることはできません。
また、今回の質問の状況では、dictionalの内容に suugaku, eigo といった変数の名前の情報は含まれていないので、関数に渡すこともできません。以下のようになっているのと等価です。

python

1 dictional = { 2 '数学': {}, 3 '英語': {}, 4 }

他の方のコメントなどにあるように、dictionalの内容を、保存してある場所からリストアする必要があるのであれば、その情報を明示的に保持しておく必要があります。
たとえば、 dictionalの中に含めるとか。

python

1 dictional = { 2 '数学': {'vals': {}, 3 'filename': 'suugaku'}, 4 '英語': {'vals': {}, 5 'filename': 'eigo'} 6 }

追記

dictional = { '数学': suugaku,~のsuugakuは全く新しい辞書で関数外で宣言したsuugaku={}とは別の辞書ということになるのでしょうか?

提示のコードでは、dictionalの数学keyに入っている辞書と、関数外で変数suugakuが指している辞書は同じものです。
ですが、それはその辞書にsuugakuという名前が付いているからではありません。関数の中の変数suugakuが外の変数suugakuと同じ辞書を指しているからです。

pythonのスコープ(変数の有効な範囲)では、関数内で、参照のみで出現する変数の場合には関数の外の変数の値を参照できるようになっています。(個人的にはよくない仕様だと思います)。
なので、質問のコードの場合、dictionalの数学keyに入っている辞書と、関数外で変数suugakuが指している辞書は同じになります。

以下のようになっている場合、違うものを指すことになります。同じ変数名ですが違う変数であり、違う辞書を指しています。(空ですが)

python

1suugaku = {} 2eigo = {} 3 4async def main(): 5 suugaku = {} 6 dictional = { 7 '数学': suugaku, 8 '英語': eigo, 9 }

投稿2022/09/23 14:45

編集2022/09/24 07:54
TakaiY

総合スコア12657

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ngmg

2022/09/23 15:20

宣言していた辞書を引数に渡すことでその辞書に値が入ると勘違いしていました。 関数内から辞書のsuugakuやeigoに値を入れるには関数内でsuugaku=やeigo=をちゃんと書かないとダメなのですね。できるだけこういう書き方をなくして柔軟なコードを目指していました。
TakaiY

2022/09/23 15:27

「辞書のsuugakuやeigoに値を入れるには関数内でsuugaku=やeigo=をちゃんと書かないとダメなのですね。」たぶん、この理解が間違えています。 eigo = {} としたときeigoという名前の辞書ができる のでは ** ありません ** 辞書そのものには名前は付いていないのです。 そのスコープでは、eigoという変数がその辞書を指している(束縛されている)のです。 その状態で、 fetch('xxx' eigo) と呼んだときには、 fetch の仮引数であるdic が その関数内で その辞書そのものに束縛されるのでfetch関数内で その辞書を参照できるようになるのです。
ngmg

2022/09/23 15:55

ちょっと混乱してます。 dictional = { '数学': suugaku,~のsuugakuは全く新しい辞書で関数外で宣言したsuugaku={}とは別の辞書ということになるのでしょうか?
shiracamus

2022/09/24 05:41 編集

変数名に応じて処理するのはプログラミング的に筋が悪いです。 指摘されているようにファイル名を引数で渡すかデータの中に定義しましょう。
TakaiY

2022/09/24 07:54

変数とそれが束縛されている変数について追記しました。
ngmg

2022/09/24 09:39

ありがとうございます。認識とかなり違っていました。 とても勉強になりました。
guest

0

もう一つファイル名を表す引数を追加するのはダメですか?
locals関数で変数名を取得できますが、大変かと思います。

投稿2022/09/23 14:06

a.com

総合スコア871

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

"tmp/"+dic+".json"ってのをprintしてみよう

投稿2022/09/23 13:16

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ngmg

2022/09/23 13:33

それだとdicの値がでてきますね。ほしいのはdicの名前ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問