Python函数只需要2个参数(给定1个)

时间:2013-12-06 17:19:31

标签: python

我正在尝试解析gmail电子邮件。来自http://yuji.wordpress.com/2011/06/22/python-imaplib-imap-example-with-gmail/我有以下内容:

def get_first_text_block(self, email_message_instance):
    maintype = email_message_instance.get_content_maintype()
    if maintype == 'multipart':
        for part in email_message_instance.get_payload():
            if part.get_content_maintype() == 'text':
                return part.get_payload()
    elif maintype == 'text':
        return email_message_instance.get_payload()    

def hello(request):
    ....   

    first = qs[0]
    one = first.get_email_object()
    print one['To']    

    out = get_first_text_block(one)

我得到了:

get_first_text_block() takes exactly 2 arguments (1 given)

我做错了什么?

4 个答案:

答案 0 :(得分:5)

self通常用于实例方法,将实例的指针传递给函数。

嗯,我们似乎不需要它。你可以省略它:

def get_first_text_block(email_message_instance):
    maintype = email_message_instance.get_content_maintype()
    if maintype == 'multipart':
        for part in email_message_instance.get_payload():
            if part.get_content_maintype() == 'text':
                return part.get_payload()
    elif maintype == 'text':
        return email_message_instance.get_payload()    

我不知道你从哪里获得此代码,但我希望这可以按预期工作!

答案 1 :(得分:3)

您必须通过View实例调用该函数。

Django用户在编写url模式时不实例化类视图是一个常见错误。如果你有“MyView”视图,你必须提供一个实例MyView()到url模式。

如果你有一些课程:

class SomeClass:
    def some_function(self, foo): pass

你必须这样称呼它:

some_instance = SomeClass()
some_instance.some_function(foo)

如果你这样称呼它:

SomeClass.some_function(富)

你实际上没有将对象(self)作为第一个param传递给some_function。

答案 2 :(得分:2)

您已将get_first_text_block定义为将'self'作为第一个参数,因为它是一个实例方法。但它实际上只是一个功能。使函数定义如下所示:

def get_first_text_block(email_message_instance):

它会起作用。

答案 3 :(得分:2)

self参数仅在将函数定义为类方法时使用。 因此,如果您希望您的函数成为模块中的全局函数,则应将其删除。 除了你的代码,我不明白为什么你需要一个参数self