Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在googleappengine中定义Python函数_Python_Google App Engine - Fatal编程技术网

在googleappengine中定义Python函数

在googleappengine中定义Python函数,python,google-app-engine,Python,Google App Engine,我是python新手,正在尝试定义一个函数,然后在Google App Engine中使用它-但我在尝试执行该函数时不断遇到错误“error:global name'cache\u email\u received\u list'未定义”。任何帮助都将不胜感激,谢谢 以下是我的功能: class EmailMessageHandler(BaseHandler2): def cache_email_sent_list(): #set email_sent_list to memcache

我是python新手,正在尝试定义一个函数,然后在Google App Engine中使用它-但我在尝试执行该函数时不断遇到错误“error:global name'cache\u email\u received\u 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()

这个问题与GAE无关

问题在于,您已经将
缓存电子邮件发送列表
定义为类
EmailMessageHandler
的方法,但您试图将其作为顶级函数调用。你不能那样做。您需要有一个
EmailMessageHandler
的实例才能调用它

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

self.cache_email_sent_list()
handler_passed_as_param_to_this_function.cache_email_sent_list()
如果您试图从其他地方调用它,则由您决定应该在哪个实例上调用它。例如:

self.cache_email_sent_list()
handler_passed_as_param_to_this_function.cache_email_sent_list()

请注意,您的错误消息是关于
cache\u email\u received\u list
,但您的代码只有
cache\u email\u sent\u 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*********') 
self.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*********') 
self.cache_email_sent_list()  
但是,如果您是从类EmailMessageHandler外部调用它,则需要首先创建一个实例,然后使用以下方法调用它:

instanceName.cache_email_sent_list()

作为对前面答案的补充:在您的帖子中,您将
cache\u email\u sent\u 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\u email\u sent\u list()方法添加正确的缩进,并在
EmailMessageHandler
的实例上调用它,就可以了。

我看不到在任何地方定义或使用了
cache\u email\u received\u list
。谢谢你们,Abarnert和Alec-解决了这个问题。就我个人而言,你能给我举个例子,说明我如何从EmailMessageHandler外部调用它吗?Thankyou@MattEllis如Roger的回答所示,要在类之外使用非静态方法,您需要创建该类的实例:
myInstance=MyClass()
然后调用您执行的方法
myInstance.myMethod()
但是,如果
EmailMessageHandler
是一个处理程序,我猜您不太可能创建它的实例。因此你有两个选择;使该方法成为静态方法-参见罗杰斯示例。或者将该方法置于类之外并使其成为全局函数。除非处理程序需要保留状态(具有实例变量),否则实际上没有必要在类中包装chache\u email\u sent\u list()。我倾向于将其作为一个全局函数来实现。除非您的处理程序是处理程序层次结构的一部分,您希望利用继承。在这种情况下,将其作为类中的静态方法实现是有意义的。希望这能有所帮助。谢谢Abarnet-我知道这是基本的Python,但是如果我在另一个处理程序中调用这个函数,我会放:EmailMessageHandler.cache\u email\u sent\u list()-thanks@MattEllis:否。您不在类上调用普通方法;在类的实例上调用它们。您需要在某个地方有一个
EmailMessageHandler
实例。它可以是局部变量、当前函数的参数、当前方法的
self
参数、某个其他对象的全局成员属性等,但无论如何,如果要使用
EmailMessageHandler
,必须拥有
EmailMessageHandler
;罗杰,你能告诉我更多关于decorators/@staticmethod的信息吗-谢谢Bruce Eckel的介绍。