NameError: 调用Python中的@staticmethod时全局名未定义
我正在做一个小项目,里面有一个主文件,叫做 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)
来调用这个方法,但每次这样做时,程序就会出错(请查看最后两行):
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
我在 blog.py
文件中使用了 from source import user
,而且 source
文件夹里也有一个空的 __init__.py
文件,所以我知道这个文件是正确导入的。
更重要的是,如果我把 user.py
文件的内容直接复制粘贴到 blog.py
文件里,一切就都能正常工作(但这样代码就会变得很大而且不够有条理)。我该怎么解决这个问题呢?
2 个回答
1
听起来你可能忘记在 blog.py 里导入 User 了:
from source.user import User
4
通过使用 from source import user
,你实际上是把 模块 user
导入进来了,而不是里面的 User
类。如果你想导入那个类,应该用 from source.user import User
。另外,你也可以先用 from source import user
导入模块,然后用 user.User
来引用这个类。
至于 staticmethod
,它跟这个问题没有关系。正如错误信息所提示的,问题在于程序不知道 User
是什么,所以根本无法调用这个类的方法。