1
resposta

Por que __len__ precisa de len() no retorno?

Os dunders methods tem retornos em que__len__ precisa ser return len(self.url), mas__str__ é somente return self.url. Por que um método contém uma função len() e a outra não contém print()?

    def __len__(self):
        return len(self.url)

    def __str__(self):
        return self.url

Quando eu rodei:

url = "bytebank.com/cambio?quantidade=100&moedaOrigem=real&moedaDestino=dolar"
extrator_url = ExtratorURL(url)
print(len(extrator_url))
print(extrator_url)

Não aceitou quando digitei return print(self.url) em __str__. Qual é a explicação interna na interpretação do Python?

1 resposta

Olá Akhenaton, tudo bem com você?

Isso acontece devido ao tipo retornado pela função print() e pela função len() e os tipos de retorno esperado pelos dunders methods __str__ e __len__.

Primeiramente analisaremos o retorno da função print(), para isso criaremos uma função que tem como objetivo fazer o retorno da função print(), e usando a função type() verificamos o tipo de retorno.

def foo():
    return print('bar')


print(type(foo()))

Resultado

bar
<class 'NoneType'>

Note que o retorno da função print() é do tipo NoneType. Para que o dunder method __str__ funcione corretamente ele deve retornar um valor do tipo string (str) o que não acontece quando retornamos a função print(), como a seguir, return print(self.url).

Agora analisaremos o retorno da função len(), criando uma função para analisar esse retorno de forma semelhante ao que fizemos anteriormente.

def foo():
    return len('bar')


print(type(foo()))

Resultado

<class 'int'>

O retorno da função len() é do tipo int e para que o dunder method __len__ funcione corretamente ele deve retornar um valor do tipo int, assim quando usado o retorno como return len(self.url) estamos retornando o comprimento de uma string, um valor do tipo int.

Em resumo temos:

  • __str__:
    • Deve retornar o tipo str, para isso podemos informar apenas o atributo self.url que contém uma representação da url como uma str.
  • __len__:
    • Deve retornar o tipo int, para isso será necessário encontrarmo primeiramente o comprimento da url e retornar esse comprimento, para isso usamos len(self.url)

Fico à disposição em caso de dúvidas.

Abraços e bons estudos.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!