在googleappengine中定义Python函数
我是python新手,正在尝试定义一个函数,然后在Google App Engine中使用它-但我在尝试执行该函数时不断遇到错误“error:global name'cache\u email\u received\u list'未定义”。任何帮助都将不胜感激,谢谢 以下是我的功能:在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
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的介绍。