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)