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

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

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

自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

339閲覧

[Python] from-import されているメソッド名一覧をリストで管理したい

libra117

総合スコア14

import

自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/05/19 01:09

編集2022/05/19 01:10

狙いとしては、リスト内をループさせてevalなど用いてメソッドを順に実行させようと思っております、他にアイデアをお持ちの方はご教授頂けると助けになります。

以下のように、自作の他ファイルからimportしたメソッド名のみをリスト化する方法はありますでしょうか。

python

1import sys 2from a import a_method 3from b import b_method 4from c import c_method 5 6method_list = ??? 7print(method_list)

出力

output

1["a_method", "b_method", "c_method"]

よろしくお願い致します。

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

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

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

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

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

guest

回答3

0

python

1import sys 2import types 3from a import a_method 4from b import b_method 5from c import c_method 6 7method_list = [f.__name__ for f in globals().values() if type(f) == types.FunctionType] 8print(method_list) 9 10# 11['a_method', 'b_method', 'c_method']

投稿2022/05/19 02:45

melian

総合スコア19798

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

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

libra117

2022/05/19 02:53

回答ありがとうございます。 なるほどtypesですね、調査不足でした... FunctionType 指定で`関数だけ`と出来るのは知らなかったので大変勉強になりました。
guest

0

疑問点

evalなど用いて

の部分の意図が不明。

python

1from a import a_method 2from b import b_method 3from c import c_method 4 5method_list= [a_method, b_method, c_method] 6 7for m in method_list: 8 m()

としない理由はどこにあるのか。


とりあえず、

python

1previous_names = set(globals().keys()) 2previous_names.add('previous_names') 3 4from a import a_method 5from b import b_method 6from c import c_method 7 8method_names = list(set(globals().keys()) - previous_names)

みたいな感じでもよいかな、と思いました。


個人的な感覚としては、この手のトリックは事故るとわけがわからなくなるので

python

1method_list= [a_method, b_method, c_method]

と明に書いて自分の手でコントロールしたいです。(最初に書いたように)

投稿2022/05/19 02:18

編集2022/05/19 02:26
quickquip

総合スコア11038

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

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

libra117

2022/05/19 02:39

回答ありがとうございます。 単純にリストにしたくなかった理由としましては、 import対象が30個かつ、場合によっては対象外・順入れ替えのimportが存在する。ためです。 仰る通り、トリック的な書き方になると思いますがふと気になり質問に至りました。 list(globals().keys()) のようにすることで取得できるのですね、調査不足でした。
quickquip

2022/05/19 02:50

> 場合によっては対象外・順入れ替えのimportが存在する 対象外があって、順番も必要なら、なおのこと自分でコントロールしなければならない気はしました(雑感です)
libra117

2022/05/19 03:13

> なおのこと自分でコントロールしなければならない気はしました(雑感です) その通りだと思います。ご意見ありがとうございます。 私の場合、from-importを消す・順番を入れ替える などしてコントロール出来るのでは、と考えておりました。
quickquip

2022/05/19 03:48

globals()が返す辞書にimportされた順に格納される のはいま「実装がそうなっている」からであって、「仕様で決まっている」ことではないと思うので(多分)、公開するコードやお客様に納品するコードでは避けるべきぐらいの感覚でしょうか。 Pyyhonのバージョンが固定されているかぎりは大丈夫で、クローズドな利用であれば構わないとも思います。
guest

0

回答者の方々により、以下の方法で解決。
importした関数をリスト化し、そのリストをループさせることで好きな順で実行可能。

python

1import sys, types 2from a import a_method 3from b import b_method 4from c import c_method 5 6method_list = list(globals().keys())[必要なところから:] 7# もしくは 8method_list = [f.__name__ for f in globals().values if type(f) == types.FunctionType] 9# method_list = ['a_method', 'b_method', 'c_method'] 10 11for m in method_list: 12 # メソッドを実行 13 eval(m)()

投稿2022/05/19 03:22

編集2022/05/19 03:23
libra117

総合スコア14

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問