Python NamedTuple

Resumo : neste tutorial, você aprenderá como usar a namedtuplefunção Python para criar tuplas nomeadas.

Introdução ao Python nomeou tuplas

O seguinte mostra uma tupla que possui dois elementos:

point = (100,200)Linguagem de código:  Python  ( python )

A pointtupla representa um ponto 2D cuja coordenada x é 100e a coordenada y é 200.

Para obter a coordenada x e a coordenada y, você pode usar a seguinte sintaxe:

 x = point[0]
 y = point[1]Linguagem de código:  Python  ( python )

Este código funciona bem. No entanto, não é tão óbvio.

Ao olhar para o point[0], você precisa saber seu significado implícito, que não é mencionado no código.

Para tornar o código mais claro, você pode querer usar um class . Por exemplo:

class Point2D:
    def __init__(self, x, y):
        self.x = x
        self.y = y
Linguagem de código:  Python  ( python )

E você pode criar uma nova instância do Point2D:

a = Point2D(100, 200)Linguagem de código:  Python  ( python )

Além disso, você pode acessar os atributos da coordenada x e da coordenada y:

print(a.x)
print(a.y)Linguagem de código:  Python  ( python )

Para comparar se dois pontos são iguais, você precisa implementar o __eq__método:

class Point2D:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __eq__(self, other):
        if isinstance(other, Point2D):
            return self.x == other.x and self.y == other.y
        return False
Linguagem de código:  Python  ( python )

O __eq__método verifica se um ponto é uma instância da Point2Dclasse e retorna Truese as coordenadas x e as coordenadas y são iguais.

O seguinte mostra como comparar duas instâncias da Point2Dclasse:

a = Point2D(100, 200)
b = Point2D(100, 200)

print(a is b)  # False
print(a == b)  # trueLinguagem de código:  Python  ( python )

Pode Point2Dfuncionar como você esperava. No entanto, você precisa escrever muito código.

Para combinar a simplicidade de uma tupla e o óbvio de uma classe, você pode usar uma tupla nomeada:

Tuplas nomeadas permitem criar tuplas e atribuir nomes significativos às posições dos elementos da tupla.

Tecnicamente, uma tupla nomeada é uma subclasse de tuple. Além disso, adiciona nomes de propriedades aos elementos posicionais.

Criando classes de tupla nomeadas

Para criar uma classe de tupla nomeada, você precisa da namedtuplefunção da collectionsbiblioteca padrão.

A namedtupleé uma função que retorna uma nova classe de tupla nomeada. Em outras palavras, namedtuple()é uma fábrica de classes.

Para usar a função, você precisa primeiro namedtupleimportá-la do módulo:collections

from collections import namedtupleLinguagem de código:  JavaScript  ( javascript )

A namedtuplefunção aceita os seguintes argumentos para gerar uma classe:

  • Um nome de classe que especifica o nome da classe de tupla nomeada.
  • Uma sequência de nomes de campos que correspondem aos elementos das tuplas. Os nomes dos campos devem ser nomes de variáveis ​​válidos, exceto que não podem começar com um sublinhado ( _).

Por exemplo, o seguinte usa a namedtuplefunção para criar a Point2Dclasse:

Point2D = namedtuple('Point2D',['x','y'])Linguagem de código:  Python  ( python )

O nomeadotuple também pode aceitar nomes de campos como:

1) Uma tupla de string:

Point2D = namedtuple('Point2D',('x','y'))Linguagem de código:  Python  ( python )

2) Ou uma única string com nomes de campos separados por vírgulas:

Point2D = namedtuple('Point2D',('x, y'))Linguagem de código:  Python  ( python )

3) Ou uma única string com nomes de campos separados por espaços em branco

Point2D = namedtuple('Point2D','x y')Linguagem de código:  Python  ( python )

Instanciando tuplas nomeadas

The Point2Dé uma classe, que é uma subclasse de tuple. E você pode criar novas instâncias da Point2Dclasse como faz com uma classe normal. Por exemplo:

point = Point2D(100, 200)

Ou você pode usar os argumentos de palavras-chave:

point = Point2D(x=100, y=200)Linguagem de código:  Python  ( python )

O pointobjeto é uma instância da Point2Dclasse. Portanto, é uma instância da tupleclasse:

print(isinstance(point, Point2D))  # True
print(isinstance(point, tuple))  # TrueLinguagem de código:  Python  ( python )

Acessando dados de uma tupla nomeada

Uma tupla nomeada é uma tupla regular. Portanto, você pode aplicar todas as operações de tupla em uma tupla nomeada.

Para acessar dados em uma tupla nomeada, você pode usar:

  • Fatiamento
  • Desempacotando
  • Indexação
  • e iterando

Por exemplo:

# unpacking
x, y = point
print(f'({x}, {y})')  # (100, 200)

# indexing
x = point[0]
y = point[1]
print(f'({x}, {y})')  # (100, 200)

# iterating

for coordinate in point:
    print(coordinate)
Linguagem de código:  Python  ( python )

Saída:

(100, 200)
(100, 200)
100
200Linguagem de código:  Python  ( python )

O argumento renomear da função nomeadatuple

A namedtuplefunção aceita o renameargumento somente de palavra-chave que permite renomear nomes de campos inválidos.

O seguinte resulta em erro porque o nome do campo _radiuscomeça com um sublinhado ( _):

from collections import namedtuple

Circle = namedtuple(
    'Circle',
    'center_x, center_y, _radius'
)
Linguagem de código:  Python  ( python )

No entanto, quando você usa o renameargumento, a namedtuplefunção renomeia automaticamente _radiuspara um nome de campo válido. Por exemplo:

from collections import namedtuple

Circle = namedtuple(
    'Circle',
    'center_x, center_y, _radius',
    rename=True
)Linguagem de código:  Python  ( python )

Para encontrar nomes de campos de uma tupla nomeada, você pode usar a _fieldspropriedade class. Por exemplo:

print(Circle._fields)Linguagem de código:  Python  ( python )

Saída:

('center_x', 'center_y', '_2')Linguagem de código:  Python  ( python )

Neste exemplo, a namedtuplefunção altera o _radiuscampo para _2automaticamente.

Funções adicionais do Python de tuplas nomeadas

Tuplas nomeadas fornecem algumas funções úteis prontas para uso. Por exemplo, você pode usar o operador igual ( ==) para comparar duas instâncias de tupla nomeadas:

a = Point2D(100, 200)
b = Point2D(100, 200)

print(a == b)  # TrueLinguagem de código:  Python  ( python )

Se você usar a classe, precisará implementar o __eq__para obter esta função.

Além disso, você pode obter a representação em string de uma tupla nomeada:

print(a)Linguagem de código:  Python  ( python )

Saída:

Point2D(x=100, y=200)Linguagem de código:  Python  ( python )

Novamente, se você usar a classe, precisará implementar __rep__o método.

Como uma tupla nomeada é uma tupla, você pode aplicar qualquer função que seja relevante a uma tupla regular a uma tupla nomeada. Por exemplo:

print(max(a))  # 200
print(min(a))  # 100Linguagem de código:  Python  ( python )

Resumo

  • Tuplas nomeadas são tuplas cujas posições dos elementos possuem nomes significativos.
  • Use a namedtuplefunção da collectionsbiblioteca padrão para criar uma classe de tupla nomeada.
  • Tuplas nomeadas são imutáveis.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *