Разница между именованными кортежами из списка строк или одной строки? - PullRequest
2 голосов
/ 27 января 2020

В чем разница между этими двумя именованными кортежами:

Point = collections.namedtuple('Point','x,y')

и

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

Оба они кажутся мне функционально одинаковыми (используя python 3.8.0)

Ответы [ 2 ]

2 голосов
/ 27 января 2020

Эти два именованных короля действительно одинаковы: -)

>>> import collections
>>> Point1 = collections.namedtuple('Point','x,y')
>>> Point2 = collections.namedtuple('Point',['x','y'])
>>> Point1._fields
('x', 'y')
>>> Point2._fields
('x', 'y')

По namedtuple () docs :

Имена полей представляют собой последовательность строк, таких как ['x', 'y']. В качестве альтернативы, field_names может быть одной строкой, в которой каждое имя поля разделено пробелами и / или запятыми, например, 'xy' или 'x, y'.

2 голосов
/ 27 января 2020

Между этими двумя определениями нет никакой разницы . Именованные кортежи поддерживают как последовательность, так и строку, разделенную запятыми или пробелами, с именами в качестве входных данных.

Из документации :

field_names являются последовательностью строк, таких как ['x', 'y']. В качестве альтернативы , field_names может быть одной строкой с каждым именем поля, разделенным пробелом и / или запятыми, например 'x y' или 'x, y'.

Bold выделено моим; строковый синтаксис 'x, y' или 'x y' является просто альтернативным способом написания имен полей.

Вы можете проверить атрибут namedtuple._fields на любом объекте, чтобы подтвердить, что они действительно в конечном итоге с одинаковыми именами полей:

>>> from collections import namedtuple
>>> namedtuple('Point', 'x,y')._fields  # string, no whitespace
('x', 'y')
>>> namedtuple('Point', ('x', 'y'))._fields   # tuple, also a sequence
('x', 'y')
>>> namedtuple('Point', 'x        y')._fields   # string with lots of spaces, no comma
('x', 'y')
...