我是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()
答案 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
。我猜你有并行代码,两种情况都是完全相同的错误,但当然我可能猜错了 - 在这种情况下你必须实际向我们展示与你显示的错误一致的代码,或者显示的代码错误...