9

私は何人かの Python プログラマーがかなり一貫して次のスタイルを使用しているのを見てきました (スタイル 1 と呼びます):

import some_module
# Use some_module.some_identifier in various places.

このスタイルをサポートするために、「明示的は暗黙的よりも優れている」という格言を引用できます。他のプログラマーがこのスタイル (スタイル 2) を使用しているのを見てきました。

from some_module import some_identifier
# Use some_identifier in various places.

スタイル 2 に見られる主な利点は保守性です。特にダック タイピングの理想では、some_module を some_other_module に交換したいと思うかもしれません。また、スタイル 2 は「読みやすさが重要」という格言でポイントを獲得していると感じています。私は反対する傾向がありますが、検索と置換は、最初のスタイルを使用する場合と同様に優れたオプションであると常に主張できます。

補遺:スタイル 1 で からへasの切り替えを解決するために使用できることに注意してください。現在のモジュールに実装することを決定することも一般的であることを忘れていました。これにより、同等のコンテナーの作成が少し厄介になります。some_modulesome_other_modulesome_identifiersome_module

4

9 に答える 9

5

次の構文が存在する場合:

import some_other_module as some_module

スタイル 2 の保守性の議論はもはや関係ありません。

私はスタイル 1 を使用する傾向があります。通常、典型的な Python プログラムでは、インポートされたパッケージ名を明示的に参照するのは数回だけです。それ以外はすべてオブジェクトのメソッドであり、もちろんインポートされたパッケージを参照する必要はありません。

于 2008-10-09T09:08:22.150 に答える
5

どちらの場合にも用途があるので、これはどちらかの問題ではないと思います。import x,y,z次の場合にfrom モジュールを使用することを検討します。

  • 輸入するものはかなり少ない

  • インポートされた関数の目的は、モジュール名から切り離すと明らかです。名前がかなり一般的である場合、他の名前と衝突し、ほとんど何も説明しない可能性があります. 例えば。見removeただけではほとんどわかりませんが、os.removeおそらくファイルを扱っていることを示唆するでしょう。

  • 名前は衝突しません。上記と似ていますが、より重要です。 次のようなことは絶対にしないでください。

     from os import open
    

import module [as renamed_module]を使用すると、何が呼び出されているかについてもう少しコンテキストが得られるという利点があります。モジュールが実際にはより多くの情報を提供していない場合、これは少し乱雑になり、パフォーマンスがわずかに低下するという欠点があります (1 回ではなく 2 回のルックアップ)。

ただし、テスト時にも利点があり (たとえば、すべてのモジュールを変更することなく、os.open をモック オブジェクトに置き換える)、変更可能なモジュールを使用するときに使用する必要があります。

import config
config.dburl = 'sqlite:///test.db'

疑わしい場合は、常にimport moduleスタイルを使用します。

于 2008-10-09T11:24:46.773 に答える
2

私は通常、これを決定するためにしきい値を使用します。内で多くのものを使用したい場合はsome_module、次を使用します。

import some_module as sm
x = sm.whatever

必要なものが 1 つまたは 2 つだけの場合:

from some_module import whatever
x = whatever

whateverもちろん、 fromは必要ないと仮定していますsome_other_module

私はインポートでこの句を使用する傾向があるasため、入力減らし、将来別のモジュールを非常に簡単に置き換えることができます。

于 2008-10-09T09:09:49.230 に答える
2

import X私はできる限り使用することを好みX.aます。

私の例外は、Django のような大きなフレームワークの深くネストされたモジュールに集中しています。それらのモジュール名は長くなる傾向があり、それらの例はすべて、どこにでもfrom django.conf import settings入力する必要がないことを示しています.django.conf.settings.DEBUG

モジュール名が深くネストされている場合、例外は を使用することfrom X.Y.Z import aです。

于 2008-10-09T10:13:42.563 に答える
1

私は表記が

from some_module import some_symbol

ほとんどの場合、最適に機能します。また、シンボルの名前が競合する場合は、次を使用できます。

from some_module import some_symbol as other_symbol

質問が述べているように、モジュール名を常に書き直すことを避け、毎回タイプミスのリスクがあります。私は構文を使用します:

import  module [as other_module]

次の 2 つの場合のみ:

  1. すべてをインポートするのにモジュール関数/オブジェクトが多すぎます
  2. モジュールは、実行中に変更される可能性のあるシンボルを定義します
于 2008-10-09T09:37:03.370 に答える
0

スタック オーバーフローの質問に興味があるかもしれません。初期化が完了していませんか?.

于 2011-06-17T12:58:47.533 に答える
0

私はPythonの新しいバージョンを信じています(2.5+?私の事実を確認する必要があります...)あなたもできる:

import some_other_module as some_module

したがって、スタイル 1 を使用して、後で別のモジュールに交換することもできます。

一般に、名前空間をどれだけ乱雑にしたいかに対応すると思います。モジュールで 1 つか 2 つの名前だけを使用しますか? またはそれらすべて(常にfrom x import *悪いわけではなく、一般的に)?

于 2008-10-09T09:10:18.387 に答える
0

私は各モジュールのいくつかのメンバーのみを使用する傾向があるため、多くの

from john import cleese
from terry import jones, gilliam

私のコードで。ほとんどのモジュールを使用すると予想され、モジュール名が短い場合は、モジュール全体 (osまたは など) をインポートします。wx名前の競合がある場合、またはその関数が何に関連付けられているかを読者に思い出させたい場合は、モジュール全体もインポートします。

import michael
import sarah

import wave

gov_speech = wave.open(sarah.palin.speechfile)
parrot_sketch = wave.open(michael.palin.justresting)

( を使用することもできますが、読者にとってはその方がなじみがあるとfrom wave import open as wave_open思います。wave.open

于 2008-10-09T13:54:15.847 に答える
0

私は個人的に自分の名前空間をあまりいじらないようにしています。

import module  

またはモジュールをmodとしてインポートします

唯一の本当の違いは、よく使われる単一のクラスを持つモジュールがある場合です。そこにいくつかの機能を追加するために型をサブクラス化したlist場合、私は使用します

from SuperImprovedListOverloadedWithFeatures import NewLIst
nl = NewList()

于 2008-10-09T10:16:30.950 に答える