web-dev-qa-db-ja.com

ワイルドカードのインポートは避けるべきですか?

PyQtを使用していますが、この問題が発生しています。私のインポートステートメントが:

from PyQt4.QtCore import *
from PyQt4.QtGui import *

次に、pylintは何百もの「未使用のインポート」警告を出します。実際に表示するのに役立つ他の未使用のインポートが存在する可能性があるため、これらをオフにすることをためらっています。別のオプションはこれを行うことです:

from PyQt4.QtCore import Qt, QPointF, QRectF
from PyQt4.QtGui import QGraphicsItem, QGraphicsScene, ...

qtGuiラインには9つのクラスがあります。 3つ目のオプションがあります。

from PyQt4 import QtCore, QtGui

次に、すべてのクラスの前にQtCoreまたはQtGuiを付けます。

この時点では、プロジェクトで最終的にどれを実行するかについてはわかりませんが、最後の方が私の観点から最も苦痛に思われます。ここでの一般的な方法は何ですか?あるスタイルを他のスタイルよりも使用する技術的な理由はありますか?

50
Colin

あなたの質問のタイトルへの答えは「はい」です。私はfrom ... import *を使用しないことをお勧めします。その理由については、最近の別の回答で説明しました。簡単に言うと、修飾名はgoodであり、ベアネームは非常に限られているため、「3番目のオプション」は、提示するものの中で(ベアネームではなく修飾名を使用するため)最適です。

(ベアネームに対する修飾名の利点には、テスト目的での偽造/モックの容易さ、偶発的な再バインドによって引き起こされた気付かれないエラーの無効化リスクへの低減、ロギングの目的で「トレースクラス」のトップネームを「偽造」する機能が含まれます。プロファイリングなどのアクティビティを使用して緩和しているものを正確に説明します-デメリット、まったくなし... ZenのPythonの最後ではありますが、最も重要ではない_import thisを参照してください。インタラクティブインタープリタープロンプト)。

同様に、QtCore.whateverと言うために7文字追加するのを嫌がる場合は、省略して-from PyQt4 import QtCore as Crおよびfrom PyQt4 import QtGi as Gu(次にCr.blahおよびGu.zorpを使用)またはなど。すべての略語と同様に、簡潔さと明快さの間のスタイルトレードオフです(変数にcount_of_all_widgets_in_the_inventorynum_widgets、またはxと名前を付けますか?多くの場合、真ん中の選択が最善ですが、常にそうとは限りません;-)。

ところで、私は1つのasまたはfromステートメントで複数のimport句を使用しないでください(混乱を招く可能性があります)。インポートが問題を引き起こしている場合はデバッグし、将来インポートを変更した場合は編集します...)。

46
Alex Martelli

import *の良い例もあります。すなわち。 Django開発者が多くの設定ファイルを持ち、インポートを使用してそれらをチェーンすることは一般的です*:

settings.py:
FOO = 1
BAR = 2
DEBUG = False

test_settings.py:
from settings import *
DEBUG = True

この場合、import *のほとんどの欠点が利点になります。

12
Tomasz Wysocki

Python doc は言う:

Although certain modules are designed to export only names that follow certain patterns when you use import *, it is still considered bad practise in production code.

副作用があり、デバッグが非常に困難になる可能性があります

個人的には、from importではなくimportを使用しています。これは、ファイルの先頭に大きな宣言があり、コードが読みやすくなっているためです。

import PyQt4

PyQt4.QtCore

モジュール名が長すぎて、asキーワードを使用してローカルで名前を変更できる場合。例えば:

 import PyQt4.QtCore as Qc

それが役に立てば幸い

3
luc

私は使用するPyQtモジュールに「インポート*」を使用していますが、独自のモジュールに配置しているため、ユーザーの名前空間を汚染しません。例えば.

Qt4.pyで:

 from PyQt4.QtCore import * 
 from PyQt4.QtGui import * 

次に、このように使用します

 import qt4 
 app = qt4.QApplication(...)
1
xioxox

pyQt4のインポートは特殊なケースです。
時々私は迅速で汚いコーディングのために「最初のオプション」を選択し、コードがどんどん長くなるときそれを「2番目のオプション」に変えます。
名前空間の衝突は、ここでは大した問題ではないかもしれません。他のパッケージの名前が大きな「Q」で始まるのを見たことはありません。そして、私がPyQt4スクリプトを終了するたびに。 「PyQt4.QtGuiインポート*から」をsthに変換します。お気に入り "

from PyQt4.QtGui import (QApplication, QDialog, QLineEdit, QTextBrowser,
                         QVBoxLayout)

"参考までに、 複数行インポートの括弧 はここで便利です。

0
sunqiang

一般的な場合、import *には絶対に反対します。 PySide2の場合、まれな例外の1つが適用されます。

from PySide2 import *

PySide2からすべての既知のモジュールをインポートするパターンです。このインポートは常に正しいため、非常に便利です。定数はCMAKEジェネレーターから計算されます。インタラクティブコンソールだけでなく、自動テストでもすばやく何かを試すときに非常に役立ちます。

高度な使用法では、この機能を実装するPySide2.__all__変数を直接使用することも意味があります。 PySide2.__all__の要素は依存関係によって順序付けられているため、最初にQtCore、次にQtGuiQtWidgetsなどと続きます。

0