質問: func.C(img_dir1) ```
回答: 素直に`func_1`の戻り値としてフォルダ名の変数値(この場合は`img_dir0`)を返し、それを`func_2`のパラメータに指定すれば良いでしょう。 * `A.py`の`func_1`の最後で`return img_dir0`とする * メインプログラムで`B.func_2(A.func_1(img,name))`とすれば1行で両方を呼び出せて、戻り値を覚えておくための作業用変数も不要になる メインプログラムの別の処理で`A.func_1`の戻り値が必要ならば、2行にして作業用変数も用意しておく ちなみに質問記事のソースコードは、いろいろと不足していたり間違っていたりするので、そのままでは動作しません。(なおパラメータの受け渡しだけチェックするためにPILの細かい処理は削って動かしたので、そのへんはチェックしていません) * メインプログラム + import glob が不足 + `glob.blob`は`glob.glob`のスペルミス + `func_1.A`と`func_2.B`は、名前の`.`の前後が逆で、`A.func_1`と`B.func_2`が正しい * A.py + `func_1`のデフォルト値付き引数のデフォルト値が、無効な値(未定義の変数)になっている `=XXX`は不要で引数だけ定義して`def func_1(img, name):`とすれば良い * B.py + import glob が不足 + `func_2`のデフォルト値付き引数のデフォルト値が、無効な値(未定義の変数)になっている `A.py`の`func_1`と同様`def func_2(img_dir0):`とすれば良い + `img_dir1 = img_dir0 + '/2_inv/'`の`'/2_inv/'`の前の`/`は不要で`'2_inv/'`とした方が良いのでは? + その下の3行分くらいインデントがおかしいですが、転記ミスでしょう。 **コメント、追記への対応:** `A.func_1` → `B.func_2` → `C.func_3`がそれぞれ前の関数の戻り値を次の関数のパラメータにして呼び出しているなら、以下のような1行で行えます。 ``` C.func_3(B.func_2(A.func_1(img,name))) ``` それでは判り難いとか、考え方が見えないという場合、以下のように考えてください。 変数の名前というのは、それを扱える有効な範囲というものがあって、スコープと呼ばれます。 例えば`A.func_1()`の`img_dir0`や`B.func_2()`の`img_dir1`という変数およびその名前はそれぞれの関数の中だけで有効になります。 `A.func_1()`で`return img_dir0`と戻り値を返しても、`A.func_1()`から戻ってきたメインプログラムでは`img_dir0`という名前の変数は使えません。 どうするかと言えば、`A.func_1()`の戻り値を受け止めるメインプログラム側の変数を用意して、そこに格納しておくわけです。 メインプログラム側の変数は他と衝突しなければ、同じ名前を定義してもかまいません。 そうやって次の関数のパラメータに指定し、また戻ってきた値を変数に入れて次の関数のパラメータに指定するという連鎖にするわけです。 ``` img_dir0 = A.func_1(img,name) img_dir1 = B.func_2(img_dir0) img_dir2 = C.func_3(img_dir1) ``` **更に追記:** `B.func_2()`に対して`name`パラメータを指定する件ですが、`A.func_1()`に使った`name`パラメータと同じならば、`B.func_2(img_dir0,name)`のように使い回してそれを指定すれば良いでしょう。 `A.func_1()`の中で作った、少しずつ切り出した`N`の名前というのなら、そもそも`img_dir0`フォルダ内にあるファイル名を取得して処理しているので、メインプログラムでやっているようにその`path`から切り出せるでしょう。 ``` for path in file: name= os.path.splitext(os.path.basename(path))[0] im_invert = ImageOps.invert(path) im_invert.save(img_dir1 + name + '_inv.png') ```