它们在功能上对我来说都是一样的。使用一个是否有任何差异和优势?
>>> from datetime import datetime, timedelta
>>> from datetime import (datetime, timedelta)
答案 0 :(得分:9)
如果在parens中包装导入,如果在import语句中放置换行符,则不必使用反斜杠表示行继续,这是首选样式。从功能上讲,它们是相同的,如果在一条线上,那么将它们排除在外就更清晰了。
答案 1 :(得分: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
答案 2 :(得分:5)
除了第一个看起来有点no difference之外,还有PEP 8。
作为旁注,似乎{{3}}也使用了示例中的第一个表单,尽管它没有说明明确排除第二个表单的首选。
答案 3 :(得分:2)
@ sr2222答案的补充。通常,如果要继续在下一行写入,则只需要这些括号。例如,您可以使用括号在以下两种方式中在两行上声明字符串:
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
两个版本的功能相同。但是使用括号而不是反斜杠是一种更好的风格。导入语句也是如此。如果整个表达式适合一行,则根本不需要括号。
答案 4 :(得分:0)
不,没有任何区别。逗号和括号是元组文字的通用Python语法。你可能会在任何地方看到它正如您所发现的,语法有两种变体,因为括号是可选的。两种选择都返回相同的值:
>>> 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(硬核)
上的文档