python - positional - TypeError: method() toma 1 argumento posicional pero 2 fueron dados
self. python tutorial (4)
Si tengo una clase ...
class MyClass:
def method(arg):
print(arg)
... que uso para crear un objeto ...
my_object = MyClass()
... en lo que llamo method("foo")
como tal ...
>>> my_object.method("foo")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: method() takes exactly 1 positional argument (2 given)
... ¿por qué Python me dice que le di dos argumentos, cuando solo di uno?
Además, como en mi caso, asegúrese de que todavía tenga un parámetro en la función. Pasé por alto eso.
tuve
class MyClass():
def foo(foo_string):
return get_bar(foo_string)
Cuando fui y cambié el método y eliminé el parámetro, olvidé actualizar mis otros archivos que usaban la misma función.
TLDR; Refactoriza tu código.
Algo más a considerar cuando se encuentra este tipo de error:
Me encontré con este mensaje de error y encontré útil esta publicación. Resulta que en mi caso había anulado un init () donde había herencia de objetos.
El ejemplo heredado es bastante largo, así que voy a saltar a un ejemplo más simple que no usa herencia:
class MyBadInitClass:
def ___init__(self, name):
self.name = name
def name_foo(self, arg):
print(self)
print(arg)
print("My name is", self.name)
class MyNewClass:
def new_foo(self, arg):
print(self)
print(arg)
my_new_object = MyNewClass()
my_new_object.new_foo("NewFoo")
my_bad_init_object = MyBadInitClass(name="Test Name")
my_bad_init_object.name_foo("name foo")
El resultado es:
<__main__.MyNewClass object at 0x033C48D0>
NewFoo
Traceback (most recent call last):
File "C:/Users/Orange/PycharmProjects/Chapter9/bad_init_example.py", line 41, in <module>
my_bad_init_object = MyBadInitClass(name="Test Name")
TypeError: object() takes no parameters
PyCharm no detectó este error tipográfico. Tampoco lo hizo Notepad ++ (otros editores / IDE podrían).
Por supuesto, este es un TypeError "no toma ningún parámetro", no es muy diferente a "got two" cuando esperaba uno, en términos de inicialización de objetos en Python.
Abordar el tema: se utilizará un inicializador de sobrecarga si es sintácticamente correcto, pero si no se ignorará y se usará el incorporado. El objeto no esperará / manejará esto y se lanzará el error.
En el caso del error de sintaxis: la solución es simple, simplemente edite la instrucción init personalizada:
def __init__(self, name):
self.name = name
En Python, esto:
my_object.method("foo")
... es azúcar sintáctica , que el intérprete traduce detrás de escena en:
MyClass.method(my_object, "foo")
... que, como puede ver, sí tiene dos argumentos: es solo que el primero está implícito, desde el punto de vista de quien llama.
Esto se debe a que la mayoría de los métodos funcionan con el objeto al que están llamados, por lo que debe haber alguna forma de referirse a ese objeto dentro del método. Por convención, este primer argumento se llama self
dentro de la definición del método:
class MyNewClass:
def method(self, arg):
print(self)
print(arg)
Si llamas al method("foo")
en una instancia de MyNewClass
, funciona como se esperaba:
>>> my_new_object = MyNewClass()
>>> my_new_object.method("foo")
<__main__.MyNewClass object at 0x29045d0>
foo
Ocasionalmente (pero no a menudo), realmente no le importa el objeto al que está sujeto su método, y en esa circunstancia, puede decorate el método con la función incorporada staticmethod()
para decirlo:
class MyOtherClass:
@staticmethod
def method(arg):
print(arg)
... en cuyo caso no necesita agregar un self
argumento a la definición del método, y todavía funciona:
>>> my_other_object = MyOtherClass()
>>> my_other_object.method("foo")
foo
Ocurre cuando no especifica el no de parámetros init () o cualquier otro método que busque
Por ejemplo
class Dog:
def __init__(self):
print("IN INIT METHOD")
def __unicode__(self,):
print("IN UNICODE METHOD")
def __str__(self):
print("IN STR METHOD")
obj=Dog("JIMMY",1,2,3,"WOOF")
Cuando ejecuta el programa anterior, le da un error como ese TypeError: __init __ () toma 1 argumento de posición pero se le dieron 6
¿Cómo podemos deshacernos de esto?
solo pasa los parámetros, qué método init () busca
class Dog:
def __init__(self, dogname, dob_d, dob_m, dob_y, dogSpeakText):
self.name_of_dog = dogname
self.date_of_birth = dob_d
self.month_of_birth = dob_m
self.year_of_birth = dob_y
self.sound_it_make = dogSpeakText
def __unicode__(self, ):
print("IN UNICODE METHOD")
def __str__(self):
print("IN STR METHOD")
obj = Dog("JIMMY", 1, 2, 3, "WOOF")
print(id(obj))