NameError:在python中调用@staticmethod时未定义全局名称

时间:2014-05-07 20:45:51

标签: python google-app-engine global static-methods

我正在创建一个小项目,我在名为blog.py的文件夹中有一个名为users.py的主文件和一个名为source的单独文件。

到目前为止,该项目的布局是:

MainFolder
    |_blog.py
    |
    |_source
        |_user.py

所以,我的user.py非常简单,并且有一个@staticmethod

from google.appengine.ext import db

class User(db.Model):
    username = db.StringProperty(required = True)
    pwd_hash = db.StringProperty(required = True)
    email = db.StringProperty()

    @staticmethod
    def searchByUsername(anUserName):
        usersList = db.GqlQuery("select * from User where username='" + anUserName + "'")
        user = None
        for theUser in usersList:
            user = theUser
        return user 

在我的blog.py文件中,我尝试通过制作User.searchByUsername(anUserName)来调用该方法,但是当我这样做时,每个人都会爆炸并且我最终会出错(检查最后2行):

Traceback (most recent call last):
  File "/home/pedro/google_appengine/google/appengine/runtime/wsgi.py", line 266, in Handle
    result = handler(dict(self._environ), self._StartResponse)
  File "/home/pedro/google_appengine/lib/webapp2-2.3/webapp2.py", line 1519, in __call__
    response = self._internal_error(e)
  File "/home/pedro/google_appengine/lib/webapp2-2.3/webapp2.py", line 1511, in __call__
    rv = self.handle_exception(request, response, e)
  File "/home/pedro/google_appengine/lib/webapp2-2.3/webapp2.py", line 1505, in __call__
    rv = self.router.dispatch(request, response)
  File "/home/pedro/google_appengine/lib/webapp2-2.3/webapp2.py", line 1253, in default_dispatcher
    return route.handler_adapter(request, response)
  File "/home/pedro/google_appengine/lib/webapp2-2.3/webapp2.py", line 1077, in __call__
    return handler.dispatch()
  File "/home/pedro/google_appengine/lib/webapp2-2.3/webapp2.py", line 547, in dispatch
    return self.handle_exception(e, self.app.debug)
  File "/home/pedro/google_appengine/lib/webapp2-2.3/webapp2.py", line 545, in dispatch
    return method(*args, **kwargs)
  File "/home/pedro/google_appengine/hw5/blog.py", line 202, in post
    user = User.searchByUsername(username)
NameError: global name 'User' is not defined

我在from source import user文件中使用blog.py,并且sources文件夹中还有__init__.py空白文件夹,因此我知道该文件已正确导入。

此外,如果我只是将user.py文件的内容复制/粘贴到blog.py文件中,一切正常(但我的代码变大了,没有组织)。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

通过执行from source import user,您要导入模块 user,而不是其中的User类。如果要导入该类,则应执行from source.user import User。或者您可以执行from source import user,然后将该类称为user.User

静态方法与它无关。正如错误消息所示,问题在于它不知道User是什么,因此它甚至无法开始调用该类的方法。

答案 1 :(得分:1)

听起来您可能忘记将用户导入blog.py:

from source.user import User