Por que obtenho AttributeError: o objeto 'NoneType' não tem atributo 'something'?

292

Eu continuo recebendo um erro que diz

AttributeError: 'NoneType' object has no attribute 'something'

O código que eu tenho é muito longo para postar aqui. Que cenários gerais causariam isso AttributeError, o que NoneTypedeveria significar e como posso restringir o que está acontecendo?

Jacob Griffin
fonte
8
Retire o menor pedaço de código que demonstra o problema. Poste isso. Adicione printfunções (ou instruções, dependendo da versão) para revelar os valores reais que as variáveis ​​realmente têm no código que está tendo esse problema.
precisa saber é o seguinte
1
'NoneType' significa tipo = Nenhum. Você provavelmente está tentando acessar uma variável não declarada. Você deve postar uma essência para que possamos ajudá-lo.
Loïc G.
2
@ LoïcGRENON: "variável não declarada"? Em Python? Isso não faz muito sentido. Como alguém declararia uma variável?
precisa saber é o seguinte
2
@ LoïcGRENON - Não em Python, não é. Você recebe uma exceção "referenciada antes da atribuição". As variáveis ​​não são padrão para None.
Gddc
1
@ LoïcGRENON: Você tem algum código que demonstra essa ideia da qual você está falando?
S.Lott

Respostas:

287

NoneType significa que, em vez de uma instância de qualquer classe ou objeto com o qual você pensa estar trabalhando, você realmente tem None. Isso geralmente significa que uma atribuição ou chamada de função acima falhou ou retornou um resultado inesperado.

gddc
fonte
111

Você tem uma variável que é igual a None e está tentando acessar um atributo chamado "alguma coisa".

foo = None
foo.something = 1

ou

foo = None
print foo.something

Ambos produzirão um AttributeError: 'NoneType'

koblas
fonte
9
Isso provavelmente é inútil até que você aponte como as pessoas podem acabar tirando Nonealguma coisa. É foo = Noneimprovável que um explícito seja o problema; vai ser foo = something()e você não percebe que something()pode retornar Nonequando não for bem-sucedido ou se o conjunto de resultados estiver vazio ou o que seja.
Tripleee
54

Outros explicaram o que NoneTypeé e uma maneira comum de terminar com ele (ou seja, falha ao retornar um valor de uma função).

Outro motivo comum que você tem Nonee não espera que seja a atribuição de uma operação no local em um objeto mutável. Por exemplo:

mylist = mylist.sort()

O sort()método de uma lista classifica a lista no local, ou seja, mylisté modificada. Mas o valor de retorno real do método é Nonee não a lista classificada. Então você acabou de atribuir Nonea mylist. Se você tentar fazer o seguinte, digamos, o mylist.append(1)Python fornecerá esse erro.

kindall
fonte
Essa é uma ótima explicação - como obter uma exceção de referência nula em c #. A variável não possui valor atribuído e é Nenhum. Thx.
Ken
17

O NoneTypeé o tipo do valor None. Nesse caso, a variável lifetimetem um valor de None.

Uma maneira comum de fazer isso acontecer é chamar uma função que falta a return.

Entretanto, há um número infinito de outras maneiras de definir uma variável como Nenhuma.

S.Lott
fonte
1
Eu não acho que lifetimetinha um valor de None(pré-edição). Ele estava tentando acessar o atributo vitalício de outra coisa que era None.
Gddc
13

Considere o código abaixo.

def return_something(someint):
 if  someint > 5:
    return someint

y = return_something(2)
y.real()

Isso vai lhe dar o erro

AttributeError: o objeto 'NoneType' não tem atributo 'real'

Então os pontos são como abaixo.

  1. No código, um método de função ou classe não está retornando nada ou retornando o None
  2. Em seguida, você tenta acessar um atributo desse objeto retornado (que é Nenhum), causando a mensagem de erro.
PHINCY L PIOUS
fonte
4

Significa o objeto que você está tentando acessar None. Noneé uma Nullvariável em python. Este tipo de erro ocorre porque o seu código é algo como isto.

x1 = None
print(x1.something)

#or

x1 = None
x1.someother = "Hellow world"

#or
x1 = None
x1.some_func()

# you can avoid some of these error by adding this kind of check
if(x1 is not None):
    ... Do something here
else:
    print("X1 variable is Null or None")
M. Hamza Rajput
fonte
1

O gddc está certo, mas adicionando um exemplo muito frequente:

Você pode chamar essa função de forma recursiva. Nesse caso, você pode acabar com ponteiro nulo ou NoneType. Nesse caso, você pode obter este erro. Portanto, antes de acessar um atributo desse parâmetro, verifique se não está NoneType.

barribow
fonte
Sim, ok, mas como você faz essa verificação?
not2qubit
if foo == None:
barribow 16/10/19
if foo is not None:
Gringo Suave
1

Ao criar um estimador (sklearn), se você esquecer de retornar a si próprio na função de ajuste, receberá o mesmo erro.

class ImputeLags(BaseEstimator, TransformerMixin):
    def __init__(self, columns):
        self.columns = columns

    def fit(self, x, y=None):
        """ do something """

    def transfrom(self, x):
        return x

AttributeError: o objeto 'NoneType' não tem atributo 'transform'?

A adição return selfà função de ajuste corrige o erro.

Chiel
fonte
0

Você pode obter esse erro comentando HTML em um aplicativo Flask. Aqui o valor para qual.date_expiry é None:

   <!-- <td>{{ qual.date_expiry.date() }}</td> -->

Exclua a linha ou corrija-a:

<td>{% if qual.date_attained != None %} {{ qual.date_attained.date() }} {% endif %} </td>
Jeremy Thompson
fonte
-1

se atribuirmos algo como o abaixo, ele gerará um erro como "AttributeError: 'NoneType' objeto não tem atributo 'show'"

df1=df.withColumn('newAge',df['Age']).show() 
BigData-Guru
fonte