84

Pythonでモジュールをインポートする場合、これの違いは何ですか?

from module import a, b, c, d

この

from module import a
from module import b
from module import c
from module import d

私にとっては、コードを凝縮して最初の例を使用することは常に理にかなっていますが、2番目の例ではいくつかのコードサンプルを見てきました。まったく違いはありますか、それともプログラマーの好みにすべて違いがありますか?

4

6 に答える 6

122

まったく違いはありません。どちらもまったく同じように機能します。

ただし、文体の観点からは、一方が他方よりも好ましい場合があります。そして、その点で、インポート用のPEP-8は、1行に圧縮し、複数行のfrom module import name1, name2ままにする必要があると述べています。import module1

Yes: import os
     import sys

No:  import sys, os

Ok: from subprocess import Popen, PIPE

@teewuaneのコメントへの応答(コメントが削除された場合に備えてここで繰り返されます):

@ inspectorG4dget 1つのモジュールから複数の関数をインポートする必要があり、その行が80文字より長くなる場合はどうなりますか?80文字のことは「コードを読みやすくするとき」であることは知っていますが、これを行うためのよりきちんとした方法があるかどうかはまだ疑問です。そして、私は基本的にすべてをインポートしていますが、fooimport*からはやりたくありません。

ここでの問題は、次のようなことを行うと、80文字の制限を超える可能性があることです。

from module import func1, func2, func3, func4, func5

これに対して、2つの応答があります(PEP8がこれについて過度に明確になっているとは思いません)。

それを2つのインポートに分割します:

from module import func1, func2, func3
from module import func4, func5

moduleこれを行うと、コードベースから削除されるか、リファクタリングされる場合、両方のインポート行を削除する必要があるという欠点があります。これは痛みを伴うことが判明する可能性があります

行を分割します

上記の懸念を軽減するために、実行する方が賢明かもしれません

from module import func1, func2, func3, \
     func4, func5

単一のインポートステートメントを維持しながら、2番目の行が最初の行と一緒に削除されない場合、これはエラーになります。

于 2013-02-21T20:20:09.833 に答える
41

inspectorG4dgetの回答から提起されたいくつかの質問に追加するために、フォルダー構造が深くネストされ始めたとき、または鈍い名前のモジュールがあるときに、タプルを使用して複数行のインポートを行うこともできます。

from some.module.submodule.that_has_long_names import (
    first_item,
    second_item,
    more_imported_items_with_really_enormously_long_names_that_might_be_too_descriptive,
    that_would_certainly_not_fit,
    on_one_line,
)

私はこのスタイルのファンではありませんが、これも機能します。

from module import (a_ton, of, modules, that_seem, to_keep, needing,
                    to_be, added, to_the_list, of_required_items)
于 2016-07-18T02:30:59.540 に答える
10

盲目的にPEP-8に従わないことをお勧めします。画面に相当する約半分のインポートがあると、物事が不快になり始め、PEP-8はPEP-20の読みやすさのガイドラインと矛盾します。

私の好みは、

  1. sys、os、timeなどのすべての組み込みインポートを1行に配置します。
  2. その他のインポートの場合は、パッケージごとに1行を使用します(モジュールではありません)。

上記は、読者が適度なコンパクトさを実現しながら依存関係をすばやく確認できるため、バランスが取れています。

例えば、

私の好み

# one line per package

import os, json, time, sys, math
import numpy as np
import torch, torch.nn as nn, torch.autograd, torch.nn.functional as F
from torchvision models, transforms

PEP-8の推奨事項

# one line per module or from ... import statement

import os
import json
import time
import sys
import math

import numpy as np

import torch
from torch import nn as nn, autograd, nn.functional as F
from torchvision import models, transforms
于 2019-04-13T04:26:32.597 に答える
1

インポートは通常、PEP8ガイドラインに従って別々の行に行う必要があります。

# Wrong Use
import os, sys
# Correct Use
import os
import sys

インポートベースのPEP8違反と修正の詳細については、https: //ayush-raj-blogs.hashnode.dev/making-clean-pr-for-open-source-contributors-pep-8-styleを確認してください。

于 2021-05-13T05:36:35.087 に答える
1

他の回答で言及されていない懸念は、gitマージの競合です。

次のインポートステートメントから始めたとしましょう。

import os

この行をimport os, sysあるブランチとimport json, os別のブランチに変更すると、それらをマージしようとしたときに次の競合が発生します。

<<<<<<< HEAD
import os, sys
=======
import json, os
>>>>>>> branch

ただし、別々の行に追加するimport sysimport json、競合のない優れたマージコミットが得られます。

--- a/foo.py
+++ b/foo.py
@@@ -1,2 -1,2 +1,3 @@@
+ import json
  import os
 +import sys

2つのインポートが同じ場所に追加された場合でも、gitはそれらがどの順序で表示されるかわからないため、競合が発生します。たとえば、のtime代わりにインポートした場合は、次のようになります。json

import os
<<<<<<< HEAD
import sys
=======
import time
>>>>>>> branch

それでも、マージの競合を回避する場合は、このスタイルを使用する価値があります。

于 2022-02-15T23:24:03.513 に答える
0

どちらも同じです。を使用しfrom module import a, b, c, dます。

モジュールの一部のみをインポートする場合は、次を使用します。

from module import a

同じモジュールから複数のコードをインポートする場合は、次を使用します。

from module import a,b,c,d

両方が同じ場合は、すべてを別々の行に書き込む必要はありません。

于 2021-11-15T15:23:05.557 に答える