Python:这两个导入语句之间有什么区别?

Python:这两个导入语句之间有什么区别?,python,import,tuples,Python,Import,Tuples,在我看来,它们在功能上都是一样的。使用它们之间有什么区别和优势吗 >>> from datetime import datetime, timedelta >>> from datetime import (datetime, timedelta) 除了第一个,还有一个对我来说更好看的 作为旁注,在示例中似乎也使用了第一种形式,尽管它没有明确说明将第二种形式排除在首选之外。如果将导入包装在parens中,则如果在import语句中放置换行符(这是首选样式),

在我看来,它们在功能上都是一样的。使用它们之间有什么区别和优势吗

>>> from datetime import datetime, timedelta
>>> from datetime import (datetime, timedelta)
除了第一个,还有一个对我来说更好看的


作为旁注,在示例中似乎也使用了第一种形式,尽管它没有明确说明将第二种形式排除在首选之外。

如果将导入包装在parens中,则如果在import语句中放置换行符(这是首选样式),则不必使用反斜杠进行换行。从功能上讲,它们是相同的,如果在同一行上,省略parens会更干净。

它们都是相同的:

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      

对@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

两个版本的功能相同。但使用括号而不是反斜杠是更好的样式。您的导入语句也是如此。如果整个表达式放在一行上,则根本不需要括号。

不,没有任何区别。逗号和方括号是元组文本的通用Python语法。你可能会在任何地方看到它们。正如您所发现的,语法有两种变体,因为括号是可选的。两个备选方案返回相同的值:

>>> 4,5
(4, 5)

>>> (4,5)
(4, 5)
然而,在一些更复杂的上下文中,解析器对逗号的理解不同,因此如果您真的想要一个元组,就有必要使用括号。例如
f(3,4)
并不等同于
f((3,4))

请参阅和的文档(硬核)