Python getattr

Resumo : neste tutorial, você aprenderá como usar a getattr()função Python para obter um atributo nomeado de um objeto.

Introdução à função getattr() do Python

A getattr()função permite obter o valor do atributo nomeado de um objeto. Aqui está a sintaxe da getattr()função:

getattr(object, name[, default])Linguagem de código:  Python  ( python )

A getattr()função aceita três parâmetros:

  • objecté o objeto do qual você deseja obter o valor de um atributo nomeado.
  • nameé uma string que especifica o nome do atributo do objeto.
  • default: se o atributo nomeado não existir no objeto, a getattr()função retornará o padrão. Se você omitir o padrão e o atributo nomeado não existir, a função gerará uma AttributeErrorexceção.

Exemplo de função Python getattr()

O exemplo a seguir ilustra como usar o getattr()para obter os valores dos atributos de um objeto:

class Member:
    def __init__(self, name, email):
        self.name = name
        self.email = email


member = Member('John Doe', '[email protected]')
name = getattr(member, 'name')
print(name)  # 👉 John Doe

email = getattr(member, 'email')
print(name)  # 👉 [email protected]

age = getattr(member, 'age')
print(age)  # 🛑 AttributeErrorLinguagem de código:  Python  ( python )

Como funciona.

Primeiro, defina uma classe Membercom dois atributos namee age:

class Member:
    def __init__(self, name, email):
        self.name = name
        self.email = emailLinguagem de código:  Python  ( python )

Segundo, crie uma nova instância da Memberclasse:

member = Member('John Doe', '[email protected]')Linguagem de código:  Python  ( python )

Terceiro, use a getattr()função para obter os valores do atributo nameand email:

name = getattr(member, 'name')
print(name)  # 👉 John Doe

email = getattr(member, 'email')
print(name)  # 👉 [email protected]Linguagem de código:  Python  ( python )

É o mesmo que acessar os atributos diretamente:

print(member.name)  # 👉 John Doe
print(member.email)  # 👉 [email protected]Linguagem de código:  Python  ( python )

Finalmente, tente acessar o atributo inexistente age. Isso gerará uma AttributeErrorexceção.

age = getattr(member, 'age')
print(age)  # 🛑 AttributeErrorLinguagem de código:  Python  ( python )

Para evitar a exceção, você pode passar Nonecomo valor padrão assim:

age = getattr(member, 'age', None)Linguagem de código:  Python  ( python )

Neste caso, ageé None.

Um exemplo prático da função getattr() do Python

Na prática, você usará a getattr()função para chamar o método de um objeto dinamicamente. Observe que um método também é um atributo de um objeto.

Suponha que você precise validar o nome e email com as seguintes regras:

  • nameé necessário, ou seja, seu comprimento é maior que zero.
  • emailé um endereço de e-mail válido

Para fazer isso, você pode criar uma classe Validation reutilizável e usá-la da seguinte maneira:

validation = Validation()
data = {'name': '', 'email': 'test'}
rules = {'name': 'required', 'email': 'email'}
errors = validation.validate(data, rules)
print(errors)Linguagem de código:  Python  ( python )

Neste código, datae rulessão dicionários.

  • Cada item no dicionário de dados possui um nome e um valor de campo.
  • Cada item no dicionário de regras possui o nome do campo e a regra, que pode ser requiredou email.

O código deve retornar a seguinte saída:

{
 'name': 'The name is required', 
 'email': 'The email is not a valid email address'
}Linguagem de código:  Python  ( python )

Vamos desenvolver a Validationaula.

Primeiro, defina uma Validationclasse:

class Validation:
    passLinguagem de código:  Python  ( python )

Segundo, declare as mensagens de erro ( ERRORS) para as regras requirede email:

class Validation:
    ERRORS = {
        'required': 'The {} is required',
        'email': 'The {} is not a valid email address'
    }Linguagem de código:  Python  ( python )

Terceiro, defina o required()método que retorna Truese o comprimento de um valor for maior que zero e email()o método que retorna Truese um valor for um endereço de e-mail válido:

import re

class Validation:
    ERRORS = {
        'required': 'The {} is required',
        'email': 'The {} is not a valid email address'
    }

    def required(self, value):
        return len(value) > 0

    def email(self, value):
        pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
        return re.fullmatch(pattern, value)Linguagem de código:  Python  ( python )

Para validar um endereço de e-mail, o email()método usa a fullmatch()função do módulo (re) expressão regular .

Finalmente, defina o validate()método:

class Validation:
    ERRORS = {
        'required': 'The {} is required',
        'email': 'The {} is not a valid email address'
    }

    def required(self, value):
        return len(value) > 0

    def email(self, value):
        pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
        return re.fullmatch(pattern, value)

    def validate(self, data, rules):
        errors = {}
        for field, rule in rules.items():
            is_valid_method = getattr(self, rule)
            if not is_valid_method(data[field]):
                errors[field] = self.ERRORS[rule].format(field)

        return errorsLinguagem de código:  Python  ( python )

No validate()método:

  1. Inicialize um dicionário de erros para armazenar mensagens de erro.
  2. Itere as regras do dicionário de regras.
  3. Para cada regra, use a getattr()função para encontrar o método que corresponde à regra. Por exemplo, getattr()retorna o requiredmétodo para a requiredregra e emailo método para a emailregra.
  4. Chame o método dinamicamente para validar os dados. Se o método retornar False, adicione a mensagem de erro ao errorsdicionário.
  5. Devolver o errors.

Junte tudo.


import re


class Validation:
    ERRORS = {
        'required': 'The {} is required',
        'email': 'The {} is not a valid email address'
    }

    def required(self, value):
        return len(value) > 0

    def email(self, value):
        pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
        return re.fullmatch(pattern, value)

    def validate(self, data, rules):
        errors = {}
        for field, rule in rules.items():
            is_valid_method = getattr(self, rule)
            if not is_valid_method(data[field]):
                errors[field] = self.ERRORS[rule].format(field)

        return errors


validation = Validation()
data = {'name': '', 'email': 'test'}
rules = {'name': 'required', 'email': 'email'}
errors = validation.validate(data, rules)
print(errors)Linguagem de código:  Python  ( python )

Saída:


import re


class Validation:
    ERRORS = {
        'required': 'The {} is required',
        'email': 'The {} is not a valid email address'
    }

    def required(self, value):
        return len(value) > 0

    def email(self, value):
        pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
        return re.fullmatch(pattern, value)

    def validate(self, data, rules):
        errors = {}
        for field, rule in rules.items():
            is_valid_method = getattr(self, rule)
            if not is_valid_method(data[field]):
                errors[field] = self.ERRORS[rule].format(field)

        return errors


if __name__ == '__main__':
    validation = Validation()
    data = {'name': '', 'email': 'test'}
    rules = {'name': 'required', 'email': 'email'}
    errors = validation.validate(data, rules)
    print(errors)Linguagem de código:  Python  ( python )

Saída:

{
 'name': 'The name is required', 
 'email': 'The email is not a valid email address'
}Linguagem de código:  Python  ( python )

Se você passar os dados válidos, os erros ficarão vazios:

# Validation class
if __name__ == '__main__':
    validation = Validation()
    data = {'name': 'John', 'email': '[email protected]'}
    rules = {'name': 'required', 'email': 'email'}
    errors = validation.validate(data, rules)
    print(errors)Linguagem de código:  Python  ( python )

Observe que este código deve conter a Validationclasse para ser executada com sucesso

Saída:

{}Linguagem de código:  Python  ( python )

Observe que você pode ocultar o método required()and email()tornando-os privados . Neste caso, você também precisa passar a regra prefixada com um sublinhado ( _) para que a getattr()função obtenha o método correspondente:


import re

class Validation:
    ERRORS = {
        'required': 'The {} is required',
        'email': 'The {} is not a valid email address'
    }

    def _required(self, value):
        return len(value) > 0

    def _email(self, value):
        pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
        return re.fullmatch(pattern, value)

    def validate(self, data, rules):
        errors = {}
        for field, rule in rules.items():
            is_valid_method = getattr(self, f'_{rule}')
            if not is_valid_method(data[field]):
                errors[field] = self.ERRORS[rule].format(field)

        return errors

Observe a seguinte linha de código:

is_valid_method = getattr(self, f'_{rule}')Linguagem de código:  PHP  ( php )

Resumo

  • Use getattr()a função Python para obter o valor de um atributo nomeado de um objeto.

Deixe um comentário

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