¿Por qué obtengo AttributeError: el objeto 'NoneType' no tiene el atributo 'algo'?

292

Sigo recibiendo un error que dice

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

El código que tengo es demasiado largo para publicarlo aquí. ¿Qué escenarios generales causarían esto AttributeError, qué se NoneTypesupone que significa y cómo puedo reducir lo que está sucediendo?

Jacob Griffin
fuente
8
Extraiga el fragmento de código más pequeño que demuestre el problema. Publica eso. Agregue printfunciones (o declaraciones según la versión) para revelar los valores reales que las variables realmente tienen en el código que tiene este problema.
S.Lott
1
'NoneType' significa tipo = Ninguno. Probablemente esté intentando acceder a una variable no declarada. Debes publicar un resumen para que podamos ayudarte.
Loïc G.
2
@ LoïcGRENON: "variable no declarada"? En Python? Eso no tiene mucho sentido. ¿Cómo se declararía una variable?
S.Lott
2
@ LoïcGRENON - No en Python no lo es. Obtiene una excepción "referenciada antes de la asignación". Las variables no están predeterminadas en None.
gddc
1
@ LoïcGRENON: ¿Tienes algún código que demuestre esta idea de la que estás hablando?
S.Lott

Respuestas:

287

NoneType significa que, en lugar de una instancia de cualquier clase u objeto con el que creas que estás trabajando, en realidad tienes None. Eso generalmente significa que una asignación o función llamada arriba falló o devolvió un resultado inesperado.

gddc
fuente
111

Tiene una variable que es igual a Ninguna y está intentando acceder a un atributo llamado 'algo'.

foo = None
foo.something = 1

o

foo = None
print foo.something

Ambos producirán un AttributeError: 'NoneType'

koblas
fuente
99
Esto probablemente no sea útil hasta que señale cómo las personas podrían terminar obteniendo Nonealgo. Un explícito foo = Nonees poco probable que sea el problema; va a ser foo = something()y no te das cuenta de que something()podría volver Nonecuando no tenga éxito o el conjunto de resultados esté vacío o lo que sea.
tripleee
54

Otros han explicado qué NoneTypees y una forma común de terminar con esto (es decir, no devolver un valor de una función).

Otra razón común que tiene Nonedonde no lo espera es la asignación de una operación in situ en un objeto mutable. Por ejemplo:

mylist = mylist.sort()

El sort()método de una lista ordena la lista en el lugar, es decir, mylistse modifica. Pero el valor de retorno real del método es Noney no la lista ordenada. Así que ha acaba de asignar Nonea mylist. Si intenta hacer lo siguiente, digamos, mylist.append(1)Python le dará este error.

un poco
fuente
Esta es una gran explicación, como obtener una excepción de referencia nula en c #. La variable no tiene un valor asignado y es None .. Thx.
Ken
17

El NoneTypees el tipo del valorNone . En este caso, la variable lifetimetiene un valor de None.

Una forma común de hacer que esto suceda es llamar a una función que falta a return.

Sin embargo, hay un número infinito de otras formas de establecer una variable en Ninguno.

S.Lott
fuente
1
No creo que lifetimetuviera un valor de None(pre-edición). Estaba tratando de acceder al atributo de por vida de otra cosa que era None.
gddc
13

Considere el siguiente código.

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

y = return_something(2)
y.real()

Esto te dará el error

AttributeError: el objeto 'NoneType' no tiene atributo 'real'

Entonces los puntos son los siguientes.

  1. En el código, una función o método de clase no devuelve nada o devuelve Ninguno
  2. Luego intenta acceder a un atributo de ese objeto devuelto (que es Ninguno), causando el mensaje de error.
PHINCY L PIOUS
fuente
4

Significa el objeto al que está intentando acceder None. Nonees una Nullvariable en python Este tipo de error ocurre cuando su código es algo como esto.

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
fuente
1

gddc tiene razón, pero agrega un ejemplo muy frecuente:

Puede llamar a esta función de forma recursiva. En ese caso, puede terminar en puntero nulo o NoneType. En ese caso, puede obtener este error. Entonces, antes de acceder a un atributo de ese parámetro, verifique si no lo está NoneType.

barribow
fuente
Sí, está bien, pero ¿cómo haces ese chequeo?
not2qubit
if foo == Ninguno:
barribow
if foo is not None:
Gringo Suave
1

Al construir un estimador (sklearn), si olvida regresar self en la función de ajuste, obtiene el mismo error.

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: ¿el objeto 'NoneType' no tiene el atributo 'transform'?

Agregar return selfa la función de ajuste corrige el error.

Chiel
fuente
0

Puede obtener este error si ha comentado HTML en una aplicación Flask. Aquí el valor de qual.date_expiry es Ninguno:

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

Elimina la línea o arréglala:

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

si asignamos algo como lo siguiente, arrojará un error como "AttributeError: el objeto 'NoneType' no tiene el atributo 'show'"

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