4

どちらも機能的には同じように見えます。それぞれを使用することの違いと利点はありますか?

>>> from datetime import datetime, timedelta
>>> from datetime import (datetime, timedelta)
4

5 に答える 5

9

インポートを括弧で囲む場合、インポートステートメントに改行を入れると、行の継続にバックスラッシュを使用する必要はありません。これは、推奨されるスタイルです。機能的には、それらは同一であり、1つの行にある場合、parensを除外する方がクリーンです。

于 2013-01-11T18:13:22.183 に答える
7

それらは両方とも同じです:

In [17]: import dis

In [18]: def func1():
   ....:     from datetime import datetime, timedelta
   ....:     

In [19]: def func2():
   ....:     from datetime import (datetime, timedelta)
   ....:     

In [20]: dis.dis(func1)
  2           0 LOAD_CONST               1 (-1)
              3 LOAD_CONST               2 (('datetime', 'timedelta'))
              6 IMPORT_NAME              0 (datetime)
              9 IMPORT_FROM              0 (datetime)
             12 STORE_FAST               0 (datetime)
             15 IMPORT_FROM              1 (timedelta)
             18 STORE_FAST               1 (timedelta)
             21 POP_TOP             
             22 LOAD_CONST               0 (None)
             25 RETURN_VALUE        

In [21]: dis.dis(func2)
  2           0 LOAD_CONST               1 (-1)
              3 LOAD_CONST               2 (('datetime', 'timedelta'))
              6 IMPORT_NAME              0 (datetime)
              9 IMPORT_FROM              0 (datetime)
             12 STORE_FAST               0 (datetime)
             15 IMPORT_FROM              1 (timedelta)
             18 STORE_FAST               1 (timedelta)
             21 POP_TOP             
             22 LOAD_CONST               0 (None)
             25 RETURN_VALUE      
于 2013-01-11T18:13:43.943 に答える
5

最初の見た目が少し良くなった以外に違いはありません。

補足として、PEP 8は例で最初の形式も使用しているように見えますが、2 番目の形式が優先されることを明示的に除外することについては何も述べていません。

于 2013-01-11T18:11:13.867 に答える
2

@ sr2222の回答への追加。通常、これらの括弧は、次の行に続けて書きたい場合にのみ必要です。たとえば、次の 2 つの方法のいずれかで、2 行で文字列を宣言するために括弧を使用できます。

In [1]: s1 = 'abc' \
   ...:     'def'

In [2]: s1
Out[2]: 'abcdef'

In [3]: s2 = ('abc'
   ...:    'def')

In [4]: s2
Out[4]: 'abcdef'

たとえば、if ステートメントについても同じことが言えます。括弧を使用して、式を複数の行に分割します。

In [6]: if 1 in \
   ...:     [1,2,3]:
   ...:     pass

In [7]: if (1 in
   ...:     [1,2,3]):
   ...:     pass

両方のバージョンの機能は同じです。ただし、バックスラッシュの代わりに括弧を使用する方が優れたスタイルです。import ステートメントと同じです。式全体が 1 行に収まる場合は、括弧はまったく必要ありません。

于 2013-01-11T18:19:50.363 に答える
0

いいえ、違いはありません。コンマと角かっこは、タプルリテラルの一般的なPython構文です。あなたはどこでもそれらを見るかもしれません。お気づきのとおり、角かっこはオプションであるため、構文には2つのバリエーションがあります。どちらの選択肢も同じ値を返します。

>>> 4,5
(4, 5)

>>> (4,5)
(4, 5)

ただし、より複雑なコンテキストでは、パーサーはコンマの理解が異なるため、本当にタプルが必要な場合は角かっこを使用する必要があります。たとえば、f(3,4)と同等ではありませんf((3,4))

http://docs.python.org/2/library/stdtypes.html#sequence-types-str-unicode-list-tuple-bytearray-buffer-xrangeおよびhttp://docs.python.org/のドキュメントを参照してください。2 / reference / grammar.html(ハードコア)

于 2013-01-11T19:03:05.160 に答える