gpt4 book ai didi

命名元组的 Python 语法

转载 作者:太空狗 更新时间:2023-10-30 00:29:35 25 4
gpt4 key购买 nike

我看到 namedtuple 的 Python 语法是:

Point = namedtuple('Point', ['x', 'y'])

为什么不像这样更简单:

Point = namedtuple(['x','y'])

它不那么冗长,

最佳答案

一般来说,对象并不知道它们被赋值给了哪些变量:

# Create three variables referring to an OrderedPair class

tmp = namedtuple('OrderedPair', ['x','y']) # create a new class with metadata
Point = tmp # assign the class to a variable
Coordinate = tmp # assign the class to another var

这是命名元组的问题。我们必须将类名传递给 namedtuple() 工厂函数,以便可以为该类指定一个有用的名称、文档字符串和 __repr__,所有这些都包含类名。

这些对您来说似乎很奇怪的原因是正常的函数和类定义的处理方式不同。 Python 对 defclass 有特殊的语法,它不仅创建函数和类,而且分配它们的元数据(名称和文档字符串)并将结果分配给变量。

考虑一下 def 做了什么:

def square(x):
'Return a value times itself'
return x * x

关键字 def 为您处理几件事(注意“square”一词将被使用两次):

tmp = lambda x: x*x                         # create a function object
tmp.__name__ = 'square' # assign its metadata
tmp.__doc__ = 'Return a value times itself'
square = tmp # assign the function to a variable

类也是如此。 class 关键字负责多个操作,否则会重复类名:

class Dog(object):
def bark(self):
return 'Woof!'

底层步骤重复类名(注意“狗”这个词用了两次):

Dog = type('Dog', (object,), {'bark': lambda self: 'Woof'})

命名元组没有像 defclass 这样的特殊关键字的优势,因此它必须自己完成第一步。分配给变量的最后一步属于您。如果您考虑一下,命名元组方式是 Python 中的规范,而 defclass 是异常(exception):

 survey_results = open('survey_results')      # is this really a duplication?
company_db = sqlite3.connect('company.db') # is this really a duplication?
www_python_org = urllib.urlopen('http://www.python.org')
radius = property(radius)

您不是第一个注意到这一点的人。 PEP 359 建议我们添加一个新关键字 make,它可以允许任何可调用对象获得 defclass 的自动分配功能,和导入

make <callable> <name> <tuple>:
<block>

将被翻译成作业:

<name> = <callable>("<name>", <tuple>, <namespace>)

最后,Guido 不喜欢“make”提议,因为它引起的问题比解决的问题多(毕竟,它只是让你免于进行单个变量赋值)。

希望能帮助您理解为什么类名被写了两次。这不是真正的重复。类名的字符串形式用于在创建对象时分配元数据,而单独的变量分配只是为您提供了一种引用该对象的方法。虽然它们通常是同名的,但它们不一定是 :-)

关于命名元组的 Python 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30282137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com