NameError: 调用Python中的@staticmethod时全局名未定义

0 投票
2 回答
1136 浏览
提问于 2025-04-18 05:44

我正在做一个小项目,里面有一个主文件,叫做 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 是什么,所以根本无法调用这个类的方法。

撰写回答