0

モジュールに次の Python コードがあります。

import ldap
import ldap.sasl
x = ldap.VERSION3
y = ldap.sasl.gssapi

Eclipse (PyDev を使用) は、最初のインポート ステートメントが使用されていないことを警告します。しかし、それは明らかに使用されています。Python は親パッケージを暗黙のうちにインポートしているようです。Python は明示的なものを好むため、これは奇妙に感じます。しかし、それは私が最初のものを使用していないという意味ではありません。さらに奇妙なことに、最後の行を削除すると、PyDev は両方のインポート ステートメントが未使用であると主張します。(この最後のケースは明らかに PyDev のバグだと思います。)

私の質問は、未使用のすべてのインポートの警告をオフにせずに、最初の行の警告をオフにする方法はありますか? @UnusedImportまた、コードをコメントで汚染したくありません。

4

1 に答える 1

1

ここでの正解は、PyDev の言うことを実行することです。

import ldap.saslは常に import をインポートするためldap、このimport ldapステートメントは必要ないため、削除する必要があります。


最後の行を削除すると両方とも未使用であると主張する PyDev については… まあ、それは間違いなく世界で最高のメッセージではありませんが、実際には間違っていません. を持っているimport ldapので不要ですimport ldap.sasl。ただし、import ldap.saslは使用しないため不要です。確かに、を削除するimport ldap.saslと、import ldap停止は不要になりますが、警告は、コードの別のバージョンに当てはまることについてではありませんよね?


おっしゃる通り、パッケージのチュートリアル セクションではこれについてまったく説明されておらず、2.x のリファレンス ドキュメントでは、それについて直接何も説明されていません。

ただし、インポート システムの 3.x リファレンス ドキュメントでは、この動作について具体的に説明し、例を示しています (たとえば、「通常のパッケージ」セクションを参照)。2.x リファレンスでは、元のパッケージ仕様を直接参照しています。

パッケージのサブモジュールがロードされるたびに、Python はパッケージ自体が最初にロードされ、__init__.py必要に応じてそのファイルがロードされることを確認します。パッケージも同様。したがって、ステートメント import Sound.Effects.echo が実行されると、最初にサウンドがロードされます。次に、Sound.Effects が読み込まれることを確認します。その後、Sound.Effects.echo がロードされていることを確認します (以前にロードされていない場合はロードします)。

また、既存のすべての Python 2.x 実装は、3.x のドキュメントと元のパッケージ仕様で説明されている方法で処理を行います。また、人々が将来まったく新しい 2.x 実装を作成する可能性は低いため、信頼できると思います。これは保証です。


元の理論的根拠を知りたい場合は、niPython 1.3 からモジュールを読む必要があります。(リンクはありません。) なぜ 2.7 でもまだそうなのか知りたいのであれば、それは Python での最初の抜本的なクリーンアップが 3.0 まで行われなかったからです。3.0 や 3.3 (改善され、さらにクリーンアップされた後) でさえもそうである理由を知りたい場合は、 python-ideasおよびpython-devのPEP 328などに関するimport議論を読む必要があります。 . そうではないというコンセンサスがあるときimportlib何かを変更する場合 (または、議論がほとんどなく、誰もコンセンサスを求める必要さえない場合)、PEP やその他のメーリング リスト以外の「紙の証跡」は得られません。私の記憶が正しければ、PEP 328 になった相対インポートと絶対インポートのアイデアについて議論しているときに、たまたま出てきましたが、修正が必要な問題だとは誰も考えていませんでした。

于 2013-05-14T23:03:06.483 に答える