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

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

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

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

Q&A

解決済

4回答

4389閲覧

if の中にimport

mito.2357

総合スコア19

Python 3.x

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

0グッド

0クリップ

投稿2019/04/09 12:15

python

1list = input() 2 3if len(list) > 1: 4 import random 5 random.shuffle(list)

リストの要素が0や1だとシャッフルしても意味が無いので、randomモジュールをimportする必要も無いですよね? このような時にif文を用いてimportするのは有りなのでしょうか? それでも最初にrandomモジュールをimportするべきなのでしょうか?

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

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

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

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

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

guest

回答4

0

そうする必要がないなら冒頭でimportすることが推奨されています。

とても時間がかかる処理 if なにか: import randam

とか

for d in すごくたくさんのループ: if 滅多に起こらない条件: import randam

みたいな馬鹿なミスを避けるために、失敗するべき時はなるべく早いうちに失敗してエラーを出してもらった方がいいので。
fail-fast の考えでしょう。


(追記)

https://www.python.org/dev/peps/pep-0008/#imports

Imports are always put at the top of the file, just after any module comments and docstrings, and before module globals and constants.

投稿2019/04/09 12:32

編集2019/04/09 12:37
quickquip

総合スコア11038

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

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

mito.2357

2019/04/09 14:00

必要性が無いなら冒頭importが推奨されているのですね。 ありがとうございます! 分からなった点があります。 滅多に起こらない条件で、importするのはあまり良くないのですか? 個人的には良く感じます。
quickquip

2019/04/09 14:07 編集

ほら、スペルミスで import がエラーになることにすぐに気づかなかったでしょう? 先頭に書いていたら起動してすぐにエラーになって分かったはずのことが、余計なことをしたせいでしばらく時間が経ってから間違いに気づく、という事態を引き起こすのです。
mito.2357

2019/04/10 04:53

なるほど笑笑 このような間違いもありうるので、 エラーを防ぐ上では冒頭importの方が良いということですね。体験させてくださりありがとうございます!
quickquip

2019/04/10 08:52

タイプミスはいつでもどこでもやってしまう可能性が高いので、想定するべきは標準以外のライブラリのインストール不備でしょうけれども。 ある環境で動いていたスクリプトを別の環境に持ってきた時に、import失敗が即座に出ないケースが面倒そうですね。
mito.2357

2019/04/17 11:31

返信遅れて申し訳ありません。 なるほど。詳しくありがとうございます。私はまだ初心者なので頭の片隅に置いておいておこうと思います。
guest

0

アリですけれど、if文がスコープを作らない以上意義は薄いと思います。

Python

1lst = [1, 2, 3] 2 3if len(lst) > 1: 4 import random 5 random.shuffle(lst) 6 7random.shuffle(lst) # 外でも普通にrandomモジュールを使える

私はスコープの先頭、つまりこの場合モジュールの先頭でimportすることがより自然に思えます。

これはOK

Python

1tf = True 2if tf: 3 import random 4 5random.shuffle

これはNG

Python

1tf = False 2if tf: 3 import random 4 5random.shuffle # => NameError: name 'random' is not defined

特に真偽値が外部からの操作に依って決まるのであれば、影響を考慮しづらくなります。

投稿2019/04/09 12:35

編集2019/04/09 12:38
LouiS0616

総合スコア35660

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

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

mito.2357

2019/04/09 13:49

スコープを作る場合は有りということですね! 勉強になりました。 ありがとうございます!
guest

0

ベストアンサー

エラーの可能性を減らしたいのであれば、quiquiさんのおっしゃる通り冒頭でimportするほうがいいでしょう。

ただ、「処理速度を上げる」という観点から考えれば、if文を用いてimportするのは有りだと思います。
下記のリンクによると、モジュールを(初回)importする時間は実行時間に大きく影響する、とされています。容量の大きいモジュールならばなおさら実行時間への影響は大きくなります。

Pythonの処理速度を上げる方法 その3

開発時の制約や要望によっては、あえてif文を用いてimportすることが正解になる場合もあるかもしれません。…極稀だとは思いますが。

投稿2019/04/09 13:14

amahara_waya

総合スコア1029

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

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

mito.2357

2019/04/09 13:46

なるほど、 エラーを減らすなら冒頭import。 処理速度を上げるなら有り。ですか、 非常に分かりやすかったです。 ありがとうございました!
guest

0

普通に有りだと思います。
特に積極的にそうする理由がないのであれば、必要なタイミングでimportすればよいです。

投稿2019/04/09 12:25

can110

総合スコア38266

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

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

can110

2019/04/09 12:41

そっか。if文スコープ作らないのは気づかなかった…
mito.2357

2019/04/09 13:51

迅速な回答ありがとうございます! importは冒頭でしないといけない。という風に聞いていたので、ある程度好きなタイミングで良いというのは大変参考になりました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問