我看到namedtuple的Python语法是:
Point = namedtuple('Point', ['x', 'y'])为什么不像这样简单:
Point = namedtuple(['x','y'])它不那么冗长,
发布于 2015-05-26 22:17:59
通常,对象不知道分配给哪些变量:
# 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为def和class提供了特殊的语法,它不仅创建函数和类,还为它们分配元数据(名称和文档字符串),并将结果分配给变量。
考虑一下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“一词被使用了两次):
Dog = type('Dog', (object,), {'bark': lambda self: 'Woof'})命名元组不具有像def或class这样的特殊关键字的优势,因此它必须先进行步骤本身。分配给变量的最后一步属于您。如果您仔细考虑一下,命名的元组方式在Python中是规范的,而def和class是例外:
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,它允许任何可调用的函数获得def、class和import的自动分配功能。
make <callable> <name> <tuple>:
<block>将被翻译成任务:
<name> = <callable>("<name>", <tuple>, <namespace>)最后,Guido不喜欢"make“建议,因为它导致的问题多于解决的问题(毕竟,它只会使您免于进行单一的变量赋值)。
希望这能帮助您了解为什么类名会被写两次。这不是真正的复制。在创建对象时,类名的字符串形式用于分配元数据,而单独的变量赋值只为您提供了一种引用该对象的方法。虽然它们通常同名,但它们不必是:-)
发布于 2015-05-17 00:53:24
namedtuple是一个工厂,返回一个类。只考虑表达:
namedtuple(['x','y'])这个表达式返回的类的名称是什么?
发布于 2015-05-17 00:52:55
这个班应该有一个名字,并知道它。它没有看到分配给它的变量,所以它不能使用它。另外,你也可以称它为其他东西,甚至什么都没有:
c = namedtuple('Point', ['x', 'y'])
do_something_with_this(namedtuple('Point', ['x', 'y']))说到更简单的语法,您也可以这样编写它:
namedtuple('Point', 'x y')https://stackoverflow.com/questions/30282137
复制相似问题