Python中的参数计数语法错误

时间:2014-08-15 20:00:11

标签: python syntax

我在尝试创建联合表生成器时出现语法错误。

这是被冒犯的翻译:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "federatedTableBuilder.py", line 7, in <module>
     local_public_files.generate()
  File "localViewDefinition.py", line 22, in generate
    self.generate_for_host(conn)
  File "localViewDefinition.py", line 17, in generate_for_host
    self.conn.doQuery(rsaconn,self.query)
TypeError: doQuery() takes exactly 2 arguments (3 given)

和违规代码:

import mysql as sql
from connector import Connector
import io
import traceback

class LocalViewDefinition:

    ...insert variables...

    def doQuery(connection, query):
        try:
            cursor = MySQLdb.cursors.Cursor(connection)
            cursor.execute(query)
        except: #figure out how to handle generic and sql errors separately
            traceback.print_exc()

你对这个原因有什么看法吗?

4 个答案:

答案 0 :(得分:4)

对于类方法,Python需要额外的第一个参数来引用类的实例。惯例是使用单词self

def doQuery(self, connection, query):
      try:
          cursor = MySQLdb.cursors.Cursor(connection)
          cursor.execute(query)
      except: #figure out how to handle generic and sql errors separately
          traceback.print_exc()

这个引用类实例的要求是因为&#34; explicit比隐含&#34;更好。在Python中(参见import this)。

答案 1 :(得分:2)

其他答案已经涵盖了这样一个事实,即您的实例方法需要self 1 作为第一个参数。但是,值得注意的是,不使用self的实例方法可能根本不应该是实例方法...

class Example(object):
    def instance_method(self):
        print "I need self: %s" % self

    @staticmethod
    def static_method():
        print "I don't need self."

    @classmethod
    def class_method(cls):
        print "I use the class, not the instance: %s" % cls

Example.static_method()  # I don't need self.
Example.class_method()  # I use the class, not the instance: ...
e = Example()
e.instance_method()  # I need self: ...
# can call staticmethods and classmethods from an instance as well:
e.static_method()  # I don't need self.

最后,静态方法通常不是非常有用。大多数情况下,没有类的模块级函数会很好。

1 名称“self”只是惯例 - 你可以使用你喜欢的任何名字,但我不建议

答案 2 :(得分:0)

您需要添加另一个参数 - 将其命名为&#34; self&#34; - 在方法定义中。

def doQuery(self, connection, query)

答案 3 :(得分:0)

将自我添加到def doQuery(连接,查询)

def doQuery(self,connection,query):

这是python类对象引用。