Type(1,)返回int expected tuple

Joe*_*ing 4 python

type(1,)
Out[1]: int
a=1,
a
Out[3]: (1,)
type(a)
Out[4]: tuple
Run Code Online (Sandbox Code Playgroud)

我正在使用Python 3.6,我期望类型(1,)返回一个元组.

根据这个链接:

...一个带有一个项目的元组是通过用逗号跟随一个值来构造的......

我错过了什么?

Par*_*ngh 10

问题在于python如何解释函数参数,同时允许"生活质量"尾随逗号.使用括号以逗号分隔的参数调用函数.传递时type(1,),逗号分隔的参数与尾随逗号和实际元组之间存在歧义.

一个简单的例子:

def test(x):
    print(x) 

test("hello") #Output: hello
test("hello",) #is also valid, Output: hello
Run Code Online (Sandbox Code Playgroud)

要了解python如何实际接受参数,您可以使用该repr函数.

repr(1)
'1'
repr(1,)
'1'
Run Code Online (Sandbox Code Playgroud)

要明确确保将元组作为第一个参数传递,应将其包含在括号中并解决歧义.

repr((1,))
'(1,)'
type((1,))
tuple
Run Code Online (Sandbox Code Playgroud)

它在分配之后工作的原因是因为在将值存储为元组时解决了歧义.

a = 1,
repr(a)
'(1,)'
Run Code Online (Sandbox Code Playgroud)

附加信息

至于尾随逗号是否有用,我们可以参考相关的PEP8部分.

当尾随逗号是多余的时,它们通常在使用版本控制系统时有用,当预期值列表,参数或导入项目随着时间的推移而延长时.模式是将每个值(等)单独放在一行上,始终添加一个尾随逗号,并在下一行添加右括号/括号/括号.

这意味着,您永远不应该将多余的尾随逗号放在一行中.

#No good
func_with_future_changes_or_variable_args(arg1, arg2=True,)

#Good
func_with_future_changes_or_variable_args(arg1,
                                          arg2=True,
                                          )
Run Code Online (Sandbox Code Playgroud)

我个人不会对更改的函数遇到太多问题,但是在维护可能随时间变化的列表或词典时,尾随逗号可以挽救生命.例如:

FILES = [
    'setup.cfg',
    'tox.ini',
    ]
Run Code Online (Sandbox Code Playgroud)

在列表中添加或删除值只需要像下面那样单独更改单行,这样可以很容易地跟踪版本控制提交.

 FILES = [
     'setup.cfg',
     'tox.ini',
+    'new_item.txt',
    ]
Run Code Online (Sandbox Code Playgroud)