Saltar al contenido

TypeError: method() toma 1 argumento posicional pero se dieron 2

Posterior a observar en diversos repositorios y sitios de internet al final hemos dado con la respuesta que te enseñamos pronto.

Solución:

En Python, esto:

my_object.method("foo")

…es azúcar sintáctico, que el intérprete traduce tras bambalinas en:

MyClass.method(my_object, "foo")

…que, como puede ver, tiene dos argumentos, es solo que el primero está implícito, desde el punto de vista de la persona que llama.

Esto se debe a que la mayoría de los métodos funcionan con el objeto al que se llaman, por lo que debe haber alguna forma de hacer referencia 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 method("foo") en una instancia de MyNewClassfunciona como se esperaba:

>>> my_new_object = MyNewClass()
>>> my_new_object.method("foo")
<__main__.MyNewClass object at 0x29045d0>
foo

De vez en cuando (pero no a menudo), realmente no se preocupa por el objeto al que está vinculado su método, y en esa circunstancia, puede decorar el método con el incorporado staticmethod() función para decirlo:

class MyOtherClass:

    @staticmethod
    def method(arg):
        print(arg)

… en cuyo caso no es necesario 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

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 pasaré a un ejemplo más simple que no usa la 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 
    my_bad_init_object = MyBadInitClass(name="Test Name")
TypeError: object() takes no parameters

PyCharm no detectó este error tipográfico. Notepad++ tampoco (otros editores/IDE podrían).

Por supuesto, este es un TypeError “no toma parámetros”, no es muy diferente de “obtuve dos” cuando esperaba uno, en términos de inicialización de objetos en Python.

Abordar el tema: se usará un inicializador de sobrecarga si es sintácticamente correcto, pero si no, se ignorará y se usará el integrado en su lugar. El objeto no espera/maneja esto y se lanza el error.

En el caso del error de sytax: la solución es simple, simplemente edite la declaración de inicio personalizada:

def __init__(self, name):
    self.name = name

En palabras simples.

En Python debes agregar self argumento como el primer argumento para todos los métodos definidos en las clases:

class MyClass:
  def method(self, arg):
    print(arg)

Entonces puedes usar tu método de acuerdo a tu intuición:

>>> my_object = MyClass()
>>> my_object.method("foo")
foo

Esto debería solucionar tu problema 🙂

Para una mejor comprensión, también puede leer las respuestas a esta pregunta: ¿Cuál es el propósito de uno mismo?

Te mostramos las reseñas y valoraciones de los lectores

Si posees alguna sospecha o forma de arreglar nuestro enunciado puedes añadir una observación y con deseo lo analizaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *