Type(1,)返回int预期元组

时间:2019-01-28 10:27:05

标签: python

type(1,)
Out[1]: int
a=1,
a
Out[3]: (1,)
type(a)
Out[4]: tuple

我正在使用Python 3.6,并且我期望type(1,)返回一个元组。

根据this link

  

...一个带有一个项目的元组是通过在值后面加上逗号来构造的。

我想念什么?

2 个答案:

答案 0 :(得分:9)

问题在于python如何解释函数自变量,同时允许“生活质量”后缀逗号。使用带有逗号分隔参数的括号来调用函数。当您传递type(1,)时,逗号分隔的参数(带有逗号)和实际的元组之间存在歧义。

一个简单的例子:

def test(x):
    print(x) 

test("hello") #Output: hello
test("hello",) #is also valid, Output: hello

要查看python实际如何接受参数,可以使用repr函数。

repr(1)
'1'
repr(1,)
'1'

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

repr((1,))
'(1,)'
type((1,))
tuple

赋值后工作的原因是因为在将值存储为元组时解决了歧义。

a = 1,
repr(a)
'(1,)'

其他信息

关于尾随逗号可能有用的情况,我们可以参考相关的PEP8部分。

  

如果结尾的逗号多余,则当   当使用值,参数或   预计进口项目会随着时间的推移而延长。模式是   将每个值(等)单独放在一行上,始终添加结尾   逗号,然后在下一行添加右括号/括号/括号。

这意味着,永远不要将多余的尾部逗号放在一行中。

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

#Good
func_with_future_changes_or_variable_args(arg1,
                                          arg2=True,
                                          )

我个人不会遇到很多会更改功能的问题,但是当维护列表或字典会随着时间变化时,逗号会节省生命。例如:

FILES = [
    'setup.cfg',
    'tox.ini',
    ]

从这样的列表中添加或删除值,仅需要像下面这样单独更改一行,就可以非常轻松地跟踪版本控制提交。

 FILES = [
     'setup.cfg',
     'tox.ini',
+    'new_item.txt',
    ]

答案 1 :(得分:0)

从文档中

  

可以通过多种方式构造音色组:

     
      
  1. 使用一对圆括号表示空元组:()
  2.   
  3. 为单例元组使用尾部逗号:a或(a,)
  4.   
  5. 用逗号分隔项目:a,b,c或(a,b,c)
  6.   
  7. 使用内置的tuple():tuple()或tuple(可迭代)
  8.   

因此,以下所有都是元组。您将注意到对变量的显式分配消除了所有歧义:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js" ></script>
<div class="navbar navbar-dark bg-dark fixed-top navbar-expand-md">
    <div class="container">
        <a class="navbar-brand" href="#">Brand</a>
        <button type="button" class="navbar-toggler" data-toggle="collapse" data-target=".navbar-collapse">&#x2630;</button>
        <div class="collapse navbar-collapse float-right">
            <ul class="nav navbar-nav">
                <li class="active nav-item"><a href="#" class="nav-link">Home</a>
                </li>
                <li class="nav-item"><a href="#about" class="nav-link">About</a>
                </li>
                <li class="nav-item"><a href="#contact" class="nav-link">Contact</a>
                </li>
            </ul>
        </div>
    </div>
</div>

当我们查看In [8]: a = () In [9]: type(a) Out[9]: tuple In [10]: b = (1,) In [11]: type(b) Out[11]: tuple In [12]: b = 1, In [13]: type(b) Out[13]: tuple 时,应该记住type(1,)是一个函数,而逗号后面是参数分隔符type()是第一个参数,它是一个整数,由于Python中允许使用逗号作为后缀,因此这是一个有效的语句,但显式的少得多。根据{{​​3}},建议使用内置的isinstance函数进行类型检查,该函数更明确:

1