1

我是 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()
4

3 回答 3

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可以了。

于 2013-08-02T14:43:49.573 回答
1

cache_email_sent_list() 是 EmailMessageHandler 类的一个方法,因此该方法需要传入 self aa 参数,因此它看起来像这样:

 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()
于 2013-08-01T22:24:37.763 回答
0

这个问题与 GAE 无关。

问题是您已将其定义cache_email_sent_list为 class 的方法EmailMessageHandler,但您试图将其称为顶级函数。你不能那样做。你需要有一个 a 的实例EmailMessageHandler来调用它。

如果您尝试从 的另一个方法调用它EmailMessageHandler,则该实例应该可以作为self. 例如:

self.cache_email_sent_list()

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

handler_passed_as_param_to_this_function.cache_email_sent_list()

请注意,您的错误消息是 about cache_email_received_list,但您的代码只有cache_email_sent_list. 我猜你有并行代码,两种情况下的错误完全相同,但我当然可能猜错了——在这种情况下,你必须实际向我们展示与你显示的错误相关的代码,或者您显示的代码出现的错误......</p>

于 2013-08-01T22:12:24.507 回答