在Google App Engine中定义Python函数

时间:2013-08-01 22:06:19

标签: python google-app-engine

我是python的新手,我正在尝试定义一个函数,然后在Google App Engine中使用它 - 但我一直收到错误“错误:当我尝试执行该函数时,未定义全局名称'cache_email_received_list'”。非常感谢任何帮助,谢谢。

这是我的功能:

class EmailMessageHandler(BaseHandler2):
def cache_email_sent_list():  #set email_sent_list to memcache
    email_sent_list = db.GqlQuery("SELECT * FROM EmailMessage WHERE sender =:1 ORDER BY created DESC", user_info.username)  
    if email_sent_list:
        string1 = "email_sent_list"
        email_sent_list_cache_id = "_".join((user_info.username, string1))                  
        memcache.set('%s' % email_sent_list_cache_id, email_sent_list, time=2000000)    
        logging.info('**************email_sent_list added to memcache*********')    

这是我试图称之为的地方:

if email_received_list is None and email_sent_list is not None:
    params = {
    'email_sent_list': email_sent_list,         
    }
    cache_email_sent_list()

3 个答案:

答案 0 :(得分:1)

cache_email_sent_list()是一个类EmailMessageHandler的方法,因此该方法需要传入一个参数,因此它将如下所示:

 class EmailMessageHandler(BaseHandler2):
    def cache_email_sent_list(self):  #set email_sent_list to memcache
        email_sent_list = db.GqlQuery("SELECT * FROM EmailMessage WHERE sender =:1 ORDER BY created DESC", user_info.username)  
        if email_sent_list:
            string1 = "email_sent_list"
            email_sent_list_cache_id = "_".join((user_info.username, string1))                  
            memcache.set('%s' % email_sent_list_cache_id, email_sent_list, time=2000000)    
            logging.info('**************email_sent_list added to memcache*********') 

然后当你从类EmailMessageHandler中调用它时,你必须这样做:

self.cache_email_sent_list()  

如果您从类EmailMessageHandler之外调用它,则需要先创建一个实例,然后使用以下命令调用它:

instanceName.cache_email_sent_list()

答案 1 :(得分:1)

作为对前一个答案的补充:在您的帖子中,您将cache_email_sent_list()定义为类定义中定义的函数,该函数不起作用。我认为你混淆了实例方法,静态方法和函数。这三者之间存在显着差异。

所以,作为一个程式化的例子:

# instance method:
class MyClass(MySuperClass):
    def my_instance_method(self):
        #your code here

# call the instance method:
instance = MyClass() # creates a new instance
instance.my_instance_method() # calls the method on the instance

# static method:
class MyClass(MySuperClass):
    @staticmethod # use decorator to nominate a static method
    def my_static_method()
        #your code here

# call the static method:
MyClass.my_static_method() # calls the static method

# function
def my_function():
    # your code here

# call the function:
my_function() # calls your function

缩进是Python语法的一部分,它决定了解释器如何处理代码。它需要一点时间习惯,但一旦你掌握了它,它实际上非常方便,使你的代码非常可读。我认为你的原帖中有缩进错误。只需为方法cache_email_sent_list()添加正确的缩进,并在EmailMessageHandler的实例上调用它,就可以了。

答案 2 :(得分:0)

问题与GAE无关。

问题在于您已将cache_email_sent_list定义为类EmailMessageHandler的方法,但您尝试将其称为顶级函数。你不能这样做。您需要有一个EmailMessageHandler的实例来调用它。

如果您尝试使用EmailMessageHandler的其他方法调用它,则该实例应该以{{1​​}}的形式提供。例如:

self

如果您尝试从其他地方拨打电话,则由您决定应该在哪个实例上调用它。例如:

self.cache_email_sent_list()

请注意,您的错误消息大约为handler_passed_as_param_to_this_function.cache_email_sent_list() ,但您的代码只有cache_email_received_list。我猜你有并行代码,两种情况都是完全相同的错误,但当然我可能猜错了 - 在这种情况下你必须实际向我们展示与你显示的错误一致的代码,或者显示的代码错误...