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

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

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

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

3回答

793閲覧

Python3 関数の実引数の値を、そのままの文字列として関数内で扱いたい

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2023/04/18 23:02

編集2023/04/19 00:20

エクセルのシートがあります。
各行が商品番号で、縦の列はimageという画像のURLが記載された列です。

商品によって画像があったりなかったりするので、
image列は「urlがある場合」と「None」の場合の2通りです。

今、このimage列を取得して、
for文で「画像があればそのURLからDLする、"None"であればprintで"その商品番号は画像がない」という分を出力する処理を作成しています。
★★★の部分です。

現状、画像がないケースでは「Noneの画像 "None"」と出力されてしまうので、それを「'item["image_aaa"]'の画像"None"」と出力できるうようにするにはどうすればよいか?という質問です。

#画像ダウンロード
def dl_images(images, sn, dir_title, footer):

def dl_images( images):

#Noneを判定 if images == "None": print(f'{images}の画像 "None"') #★★★ else: if type(images) == list: arr_images = images.split(',') for image in arr_images: pass # print(image) else: arr_images = images.split(',') for image in arr_images: num = str(arr_images.index(image)+1).zfill(2) file_name = f'{dir_title}/{sn[1]}_{footer}_{num}.jpg' #DL済ならスキップ if not os.path.isfile(file_name): response = requests.get(image) res_image = response.content with open(file_name, "wb") as fn: fn.write(res_image) #画像のリサイズを行う NFN.resize_images(dir_title) else: pass # print("画像はDL済み") # print(f'{sn[1]}:画像DL&リサイズ完了')

dl_images(item["image_aaa"], item["sn"], dir_title, "aaa")

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

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

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

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

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

dameo

2023/04/18 23:18

日本語大丈夫ですか?ちゃんとコードで説明しましょう。
退会済みユーザー

退会済みユーザー

2023/04/18 23:22

失礼いたしました、書き直します。 def test(dict_string): print(dict_string) このような関数を作成した場合、 test(dict["aaa"])という引数を代入した場合、 printの結果は、'dict["aaa"]'ではなく、'dict["aaa"]'の中身が展開された値が出力されます。 この場合において、printの結果を'dict["aaa"]'そのものにする方法はありますでしょうか? という質問です。私の意図は伝わっているでしょうか?
maisumakun

2023/04/18 23:29

なぜそのようなことをしたいのでしょうか?(単に'dict["aaa"]'という文字列を渡すのでは何がよくないのでしょうか)
退会済みユーザー

退会済みユーザー

2023/04/18 23:37 編集

たしかに、関数内で str = 'dict["aaa"]'とすれば簡単に欲しい結果は得られますが、そこを実引数に入力された値によって自動的に変化する仕組みにしたいのです。
maisumakun

2023/04/18 23:38

単に'dict["aaa"]'という文字列を渡すのでは何がよくないのでしょうか?
退会済みユーザー

退会済みユーザー

2023/04/18 23:42

def test(dict_string): print(’dict["aaa"]') だと、 test(dict["aaa"]) test(dict["bbb"]) test(dict["ccc"]) 3つ用意したとしても、全てprintの結果は’dict["aaa"]'になりますよね? それを、全ての結果で引数に応じて、 ’dict["aaa"]' ’dict["bbb"]' ’dict["ccc"]' と出力させたいのです。 「なぜそうしたいのか?」という質問は、「そうしたいから」です。 その方法は仕組みとしてありますか?という質問です。
maisumakun

2023/04/18 23:46 編集

いえ、test(’dict["aaa"]')と呼んではいけないのか、という話です。 > 「なぜそうしたいのか?」という質問は、「そうしたいから」です。 単に「技術的にできるかできないか『だけ』」問いたいのであれば別ですが、この実装を通じてやりたいことがある場合、「全く別な方法」で実装できる可能性がありますので、本当にやりたいことを書いたほうが役に立ちます。
退会済みユーザー

退会済みユーザー

2023/04/18 23:45

それは、dict["aaa"]自体も、それとして関数の中で展開して使いたいからです。
maisumakun

2023/04/18 23:48

dict["aaa"]以外に、どんな式を渡す予定がありますか?
退会済みユーザー

退会済みユーザー

2023/04/18 23:50

では、改めて意図を説明してみますね。 dict["aaa"]という引数を関数の中で展開しつつ、かつ、printで'dict["aaa"]'という文言を出力したい理由は、実際に辞書の値を展開して処理を行いつつ、実行している内容(対象)をprintによってターミナルに出力したいからです。 dictの各値には真偽値が入っており、どのキーがTrue,Falseになったかを処理が走る様子を眺めながら確認したいのです。
quickquip

2023/04/18 23:51

技術的な興味ではなくて、**実際に**こういうことがしたい、という意図なのであれば、どのようなデータ構造を現状持っているか、どのようなことがやりたいか、なぜそのようなことをしたいかを、**具体的に**質問に書かないと駄目なケースです。 想像や経験からは、そういう場合は、やりたいことに対して **データ構造がふさわしくない** ケースだと考えられます。 そこを端折ってしまうと「出来るわけかない」以上の回答が付きません。
quickquip

2023/04/18 23:53

入れ違いましたね。そういうことはこの欄ではなくて、**質問を修正して**記述しましょう。
退会済みユーザー

退会済みユーザー

2023/04/18 23:57

ご指摘ありがとうございます。 確かに、作成中のスクリプトの一部を端折ってとても抽象的な質問をしたために大変言葉足らずになってしまいました。 簡潔に質問の意図を示すため、具体例を用意して冒頭の質問内容を修正いたします。
dameo

2023/04/18 23:59

ようはちょっと思いついた疑問を他人にぶつけて、新しい知識を欲しいだけの人ですよ。 しかも自分が無知なのを指摘されるのは何よりも嫌な人ですね。 個人的にその辺の心理はよく分かりませんが、知りたいことをストレートに聞きましょう。 回りくどいです。 呼び出す際にdict["aaa"]が評価された「結果」が渡されるので、呼び出された関数側で元が何であったかはどこにも残っていません。 近い形だと、dict["aaa"]を返す関数にして関数自体を引数にする(遅延評価にする)という手くらいでしょうか。 元の関数コードその他くらいは見ることが出来ます。同様に解析すれば必要なだけ辿って復元できると思いますよ。 def test(dict_func): print(dict_func) import inspect print(inspect.getsourcelines(dict_func)) print(dict_func()) def get_hoge_func(d, key): def hoge(): return d[key] return hoge data = {'key': 'value'} test(get_hoge_func(data, 'key')) # <function get_hoge_func.<locals>.hoge at 0x7f852a90c0d0> # ([' def hoge():\n', ' return d[key]\n'], 8) # value
dameo

2023/04/19 00:24

質問内容が変わりましたね。そういう話なのであれば、スタックトレースでも表示させてみては? htmlならコメントの中にでも仕込めばいいでしょう。 def test(dict_func): import traceback traceback.print_stack() def get_hoge_func(d, key): def hoge(): return d[key] return hoge data = {'key': 'value'} test(get_hoge_func(data, 'key')) # File "hoge.py", line 11, in <module> # test(get_hoge_func(data, 'key')) # File "hoge.py", line 3, in test # traceback.print_stack()
退会済みユーザー

退会済みユーザー

2023/04/19 00:35

回答ありがとうございます。 スタックトレースは初めて聞いた単語で、文献読んでいますが今すぐに理解難しいそうです。そこは自分でもう少し学習します。htmlならコメントの中に仕込むというのはどういう意味でしょうか?
dameo

2023/04/19 00:42

これだけやると、例外で落ちたときのような表示が出ます。 import traceback traceback.print_stack() これは今の関数呼び出し履歴(コールスタック/スタックトレース)を表示する方法です。 スクレイピングをしているなら、pythonの使い方その他で他人に迷惑をかけないようになってから、かつ「法令を遵守して」やってください。そこが明確でないならやってはいけません。 コメントに仕込むというのはWebアプリの可能性を考慮した発言です。 ピンと来ないならスクレイピングなんでしょう。 以降コメントしません。
guest

回答3

0

dictしか参照しないのであれば、キーだけ受け取ればいいのではないでしょうか?

python

1def test(key): 2 print(key) 3 print(dict[key])

投稿2023/04/18 23:52

maisumakun

総合スコア145183

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

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

退会済みユーザー

退会済みユーザー

2023/04/19 00:33

回答ありがとうございます。 print(f'{dict[images]}の画像 "None"')と試してみましたが、 'dict['None']の画像 "None"'と出力されました。キーが実引数と同じ文字列で'item["image_aaa"]'の画像"None"出力されてほしいので、他の方法を探してみます。
guest

0

実引数に変数を指定した場合のその変数の「名前」は関数には渡されないので通常の方法で取得することはできません。

pythonインタープリタならその時点での呼び出し階層の情報(call stack)を持っていますので、そこから取り出せば、どのように呼ばれたのかは取得できます。

python

1import traceback as tb 2 3def f(a): 4 stack_data = tb.format_stack(limit=2) 5 print(stack_data[0]) 6 7x = 10 8f(x)

ただ、取り出せますが、文字列の情報なので目的のものを取り出すには手間がかかりますし、この部分を関数化しようとするとより面倒になったり、状況によっては取れなかったりします。

ちなみに、仮引数は変数でなければならないので、def test(dict[aaa])このような形での関数定義はできません。

投稿2023/04/19 02:07

TakaiY

総合スコア12763

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

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

0

ベストアンサー

皆様ご回答ありがとうございました。
説明不足でお時間撮らせてしまい申し訳ございませんでした。

トレースバックも調べてみましたが例外処理の発生が必要?のようで、
結論として簡単に自分の思う値を出力できないことが分かりましたので本件クローズいたします。

投稿2023/04/19 00:42

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

TakaiY

2023/04/19 02:28

> トレースバックも調べてみましたが例外処理の発生が必要?のようで 例外の発生が必要ということはありません。 回答のコードを確認ください。動かしてみればわかります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問