Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 成功导入的类为None,但仅在方法内部_Python_Django_Django 1.5 - Fatal编程技术网

Python 成功导入的类为None,但仅在方法内部

Python 成功导入的类为None,但仅在方法内部,python,django,django-1.5,Python,Django,Django 1.5,我在Django应用程序的models.py中有类似的代码: from main.models import SmartPrefetchQuerySet class EventPrivacyManager(SoftDeletablePrivacyManager): def get_query_set_for_producer(self, producer): return self.get_query_set().filter(users_about=producer)

我在Django应用程序的models.py中有类似的代码:

from main.models import SmartPrefetchQuerySet

class EventPrivacyManager(SoftDeletablePrivacyManager):
    def get_query_set_for_producer(self, producer):
        return self.get_query_set().filter(users_about=producer)

    def get_query_set(self):
        return SmartPrefetchQuerySet(self.model, using=self._db)

    ...
导入工作正常--我可以
在模块本身中打印SmartPrefetchQuerySet
,输出为
。但是,当我实际调用get\u query\u set方法时,我得到如下结果:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File ".../feeds/models.py", line 29, in smart_prefetch_for
    return self.get_query_set().smart_prefetch_for(*args, **kwargs)
  File ".../feeds/models.py", line 26, in get_query_set
    return SmartPrefetchQuerySet(self.model, using=self._db)
TypeError: 'NoneType' object is not callable
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“../feeds/models.py”,第29行,在
返回self.get_query_set().smart_prefetch_for(*args,**kwargs)
文件“../feeds/models.py”,第26行,在get\u query\u集中
返回SmartPrefetchQuerySet(self.model,using=self.\u db)
TypeError:“非类型”对象不可调用
另一方面,如果我将导入移动到get\u query\u set方法本身中,它就可以正常工作。如果我打开一个Django shell并通过直接将事件模型传递给它来实例化SmartPrefetchQuerySet,这也很好。只有在方法内部,SmartPrefetchQuerySet才显示为None(注入该方法的print语句验证名称是否确实指向None)

“SmartPrefetchQuerySet”名称仅在该类的类定义中使用,并在此处调用它,而在代码库中没有其他名称

考虑到Python名称空间的正常工作方式,我不理解这种行为是如何可能的。如何将导入的名称定义为模块级的一件事,以及同一模块中的方法内部的一件完全不同的事,而在模块中的任何位置都没有对该名称的其他赋值?到目前为止,我唯一的想法是,这可能是一个循环导入问题,但我找不到任何这样的循环导入,通常循环导入似乎会导致不太微妙的问题

编辑:整个models.py文件,略为精简:

from django.db import models

from django.conf import settings

from auth.models import HasPrivacy, SoftDeletablePrivacyManager
from lck.django.common.models import TimeTrackable, SoftDeletable
from groups.models import Group

from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic
from django.utils import timezone

from main.models import SmartPrefetchQuerySet # not literally from a module named "main", but the name has to be sanitized for this post

print SmartPrefetchQuerySet # prints "<class 'main.models.SmartPrefetchQuerySet'>"

# Note: there is an additional import at the bottom of this file for event signal registration

class EventPrivacyManager(SoftDeletablePrivacyManager):
    def get_query_set_for_producer(self, producer):
        "class that can be overridden by children of this manager for models that don't have a 'user' attrib"
        return self.get_query_set().filter(users_about=producer)

    def get_query_set(self):
        print SmartPrefetchQuerySet # prints "None"
        return SmartPrefetchQuerySet(self.model, using=self._db)

    def smart_prefetch_for(self, *args, **kwargs):
        return self.get_query_set().smart_prefetch_for(*args, **kwargs)

class Event(HasPrivacy, SoftDeletable, TimeTrackable):
    ...

    objects = EventPrivacyManager()

    ...

class Notification(SoftDeletable, TimeTrackable):
    ...

print SmartPrefetchQuerySet # prints "<class 'main.models.SmartPrefetchQuerySet'>"

# this import registers the event signal handlers.
# don't remove it even if it doesn't look like it's being used in this
# file, and don't move it from the bottom of this file in order to avoid
# circular imports!
import events

print SmartPrefetchQuerySet # prints "<class 'main.models.SmartPrefetchQuerySet'>"
来自django.db导入模型的

从django.conf导入设置
从auth.models导入HasPrivacy,SoftDeletablePrivacyManager
从lck.django.common.models导入可时间跟踪的软数据表
从groups.models导入组
从django.contrib.contenttypes.models导入ContentType
从django.contrib.contenttypes导入泛型
从django.utils导入时区
从main.models导入SmartPrefetchQuerySet#并不是从一个名为“main”的模块中直接导入的,但是这个模块的名称必须为这个帖子进行消毒
打印SmartPrefetchQuerySet#打印“”
#注意:此文件底部还有一个用于事件信号注册的附加导入
类EventPrivacyManager(SoftDeletablePrivacyManager):
def get_query_set_for_producer(self,producer):
“对于没有“用户”属性的模型,此管理器的子级可以覆盖的类”
返回self.get\u query\u set().filter(users\u about=producer)
def获取查询集(自身):
打印SmartPrefetchQuerySet#打印“无”
返回SmartPrefetchQuerySet(self.model,using=self.\u db)
def智能预取功能(self、*args、**kwargs):
返回self.get_query_set().smart_prefetch_for(*args,**kwargs)
类事件(具有隐私性、可软删除、可时间跟踪):
...
对象=EventPrivacyManager()
...
类通知(可软删除、可时间跟踪):
...
打印SmartPrefetchQuerySet#打印“”
#此导入注册事件信号处理程序。
#不要移除它,即使它看起来不像是在这个过程中使用的
#文件,并且不要将其从该文件的底部移动,以避免
#循环进口!
导入事件
打印SmartPrefetchQuerySet#打印“”

如果
SmartPrefetchQuerySet
是用C编写的,那么问题实际上可能在调用内部,而不是
SmartPrefetchQuerySet
本身是
None
。您可以看到内置的类似结果:

>>> max([1,2], key=None)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not callable
>最大值([1,2],键=无)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:“非类型”对象不可调用

检查您作为参数传递的内容。

您使用的是哪个版本的Django?在
1.6
get\u query\u set
现在是
get\u queryset
我使用的是1.5版,所以这个命名应该是正确的。尝试在模块末尾,在任何其他运行代码之前添加
print SmartPrefetchQuerySet
,看看类是否已经是
None
。某处有东西在重新分配它,否则你会得到一个
名称错误
@Bakuriu好吧,我试过了;不幸的是,结果没有帮助,因为名称在整个模块中(包括在最终导入之前和之后)仍然定义为类,而不是“无”。我将编辑代码示例以显示这些打印语句及其输出。
SmartPrefetchQuerySet
是纯python,从纯python
django.db.models.query.QuerySet
子类化。此外,如问题中所述,在调用之前放置的print语句验证该名称在该上下文中是否为None。我可以发布SmartPrefetchQuerySet模块,但由于模块的
\uuuu init\uuuu
肯定没有被调用,因此它似乎还不相关。真奇怪。您能否发布其余的代码,以便我们查看是否正在生成该名称的任何其他绑定?
SmartPrefetchQuerySet
EventPrivacyManager
,或整个事件模块?您显示的代码所来自的文件的其余部分,带有打印语句。好的,但为了简洁起见,我必须将该文件中定义的类去掉,而不是
EventPrivacyManager
。这应该不是问题,因为我无法想象不在这里调用类定义会如何影响命名空间。