首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >namedtuple的Python语法

namedtuple的Python语法
EN

Stack Overflow用户
提问于 2015-05-17 00:34:19
回答 4查看 1.5K关注 0票数 7

我看到namedtuple的Python语法是:

代码语言:javascript
复制
Point = namedtuple('Point', ['x', 'y'])

为什么不像这样简单:

代码语言:javascript
复制
Point = namedtuple(['x','y'])

它不那么冗长,

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-05-26 22:17:59

通常,对象不知道分配给哪些变量:

代码语言:javascript
复制
# 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()工厂函数,以便类可以被赋予一个有用的名称,docstring和__repr__ --所有这些类都有它的类名。

这些原因让您感到奇怪的是,普通函数和类定义的处理方式不同。Python为defclass提供了特殊的语法,它不仅创建函数和类,还为它们分配元数据(名称和文档字符串),并将结果分配给变量。

考虑一下def所做的事情:

代码语言:javascript
复制
def square(x):
    'Return a value times itself'
    return x * x

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

代码语言:javascript
复制
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关键字处理多个操作,否则这些操作会重复类名:

代码语言:javascript
复制
class Dog(object):
    def bark(self):
        return 'Woof!'

底层步骤重复类名(注意"Dog“一词被使用了两次):

代码语言:javascript
复制
Dog = type('Dog', (object,), {'bark': lambda self: 'Woof'})

命名元组不具有像defclass这样的特殊关键字的优势,因此它必须先进行步骤本身。分配给变量的最后一步属于您。如果您仔细考虑一下,命名的元组方式在Python中是规范的,而defclass是例外:

代码语言:javascript
复制
 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,它允许任何可调用的函数获得defclassimport的自动分配功能。

代码语言:javascript
复制
make <callable> <name> <tuple>:
    <block>

将被翻译成任务:

代码语言:javascript
复制
<name> = <callable>("<name>", <tuple>, <namespace>)

最后,Guido不喜欢"make“建议,因为它导致的问题多于解决的问题(毕竟,它只会使您免于进行单一的变量赋值)。

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

票数 11
EN

Stack Overflow用户

发布于 2015-05-17 00:53:24

namedtuple是一个工厂,返回一个类。只考虑表达:

代码语言:javascript
复制
namedtuple(['x','y'])

这个表达式返回的类的名称是什么?

票数 4
EN

Stack Overflow用户

发布于 2015-05-17 00:52:55

这个班应该有一个名字,并知道它。它没有看到分配给它的变量,所以它不能使用它。另外,你也可以称它为其他东西,甚至什么都没有:

代码语言:javascript
复制
c = namedtuple('Point', ['x', 'y'])
do_something_with_this(namedtuple('Point', ['x', 'y']))

说到更简单的语法,您也可以这样编写它:

代码语言:javascript
复制
namedtuple('Point', 'x y')
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30282137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档