【问题标题】:Python 2.7 / App Engine - TypeError: is_valid() takes exactly 2 arguments (3 given)Python 2.7 / App Engine - TypeError: is_valid() 只需要 2 个参数(给定 3 个)
【发布时间】:2012-05-18 16:00:05
【问题描述】:

以下代码与我正在使用的代码很接近,而且不会太长。我收到错误TypeError: is_valid() takes exactly 2 arguments (3 given)。在我看来,我只传递了 2 个论点。那么第三个论点是从哪里来的呢?

models/MyModel.py

from google.appengine.ext import db

class MyModel(db.model):
    a = db.StringProperty(required=True)
    b = db.StringProperty(required=True)
    c = db.StringProperty(required=True)

class Update:
    def is_valid(x, y)
        myquery = db.GqlQuery('SELECT * FROM Valid WHERE value = :1' x)
        v = myquery.get()

        if v.something == y:
            yet_more_stuff
            return(True)
        else:
            return(False)

控制器/WebHandler.py

import webapp2
from models.MyModel import Update

class WebHandler(webapp2.RequestHandler):
    def get(self):
        var_x = "string"
        var_y = "string"
        z = Update()
        if z.is_valid(var_x, var_y): <----- line error occurs
            do_some_stuff
        else
            do_some_other_stuff

这可能很简单,但今天编码 18 小时后,我的大脑变成了燕麦片。

【问题讨论】:

    标签: python google-app-engine python-2.7 typeerror


    【解决方案1】:

    把代码改成def is_valid(self, x, y)

    【讨论】:

      【解决方案2】:

      解决方案

      您有两种解决方案:

      • 在方法定义中添加一个表示实例的参数(将其命名为self 以保持一致性),或者
      • 在方法上使用 staticmethod 装饰器。

      说明和例子

      这一行:

      def is_valid(x, y):
      

      表示调用方法时,x 是类实例,y 是参数。如果你想接受两个参数(实例本身),你的行应该是这样的:

      def is_valid(self, x, y)
      

      但是因为你没有对实例本身做任何动作,你也可以使用staticmethod装饰器:

      @staticmethod
      def is_valid(x, y):
      

      这将摆脱在参数中传递的实例,您将只收到剩余的参数。

      【讨论】:

      • 或者,更好的是,完全摆脱这个类,因为它没有封装任何数据,而且我看不到任何用途。
      • @Wooble:也许它是为了将来服务于某些目的,而 OP 不想更改 API?
      • 下面的 Tadeck 和 Shay 都是对的。昨晚我确实使用了 self ,但是在我疲倦的时候,我也从 WebHandler 传递了 self ,这给了我一个不同的 TypeError ,就像试图将 WebHandler Instance 传递给 Update Instance 一样。我不知道为什么我昨晚没有想到@staticmethod,但你是对的,它也有效。由于添加了该内容并进行了更详细的说明,因此我给了您公认的答案。感谢 Tadeck 和 @Shay-Erlichmen
      猜你喜欢
      • 1970-01-01
      • 2018-07-14
      • 2013-04-07
      • 1970-01-01
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 2018-08-20
      • 1970-01-01
      相关资源
      最近更新 更多