gpt4 book ai didi

python - 如何找出 Python 对象丢失属性的原因/时间?

转载 作者:太空宇宙 更新时间:2023-11-03 15:27:04 25 4
gpt4 key购买 nike

更新 2013-02-08

我现在明白了为什么我无法在一小段测试代码中重现这个问题。在小程序中,Python 的垃圾收集器不是很活跃。我认为问题在于 Python 正在收集一些仅在 GObject 中引用的对象。我认为这是涉及 this bug 的回归,或新的类似错误。

我想通了,因为我再次遇到了同样的问题,但是我自己的类(它只引用了 GObject 对象)——这次整个 dict 在对象上被清除了.如果我使用代码 here监视消失的属性之一,它不会消失!似乎额外的引用保留了属性。这闻起来像垃圾收集器问题。我通过在初始化期间将对象添加到全局列表来确认这一点...这也解决了现在发生的问题。

原始问题

我在使用 PyGTK GUI 时遇到了一些奇怪的行为。我有一个不断丢失大量属性的对象。我正在尝试确定这是否是我的代码、Python 解释器或 PyGTK 中的错误。

我没有调用 delattr()。我尝试通过使用总是引发异常的代码覆盖 __delattr__() 来检测是否有任何东西正在调用我的对象的 __delattr__() 方法。我能够重现导致对象失去其属性的事件,但从未引发异常。我不确定是否有其他方法可以找出是什么函数调用(如果有的话)导致对象丢失属性。

有问题的对象一直运行良好,直到它突然失去我试图访问的属性。

在 GUI 中执行一些与丢失属性的对象无关的操作后,属性丢失始终发生。我偶然发现了它;可能还有其他操作导致对象失去其属性。

我已将 print id(self) 添加到访问消失属性的方法中。属性消失前后打印的id是一样的。

关于如何追踪此问题的根源有什么建议吗?

引用代码如下: (注意:如果/当我想出一个可重现问题的简化测试用例时,我将更新此代码。现在重现该问题所需的总代码错误太大,无法在此处发布。)

这是我的对象的类,它失去了它的属性。这显然是真实功能代码的最小化版本,但我正在使用它进行调试,但问题仍然存在。

它是我的自定义 MenuBar 类的子类。请注意,on_file_import__activate() 方法通过父类之一连接到菜单项的信号。

class FluidClassManagerWindowMenu(MenuBar):
menu_items = [("File",("Import",))]

def __init__(self, parent):
# XXX: different name than self.parent to see if it stops disappearing
self._xxx_my_parent = parent
MenuBar.__init__(self, parent)

def __delattr__(self,attr):
# XXX: trying to find the cause for lost attributes
traceback.print_stack()

def on_file_import__activate(self, widget=None, data=None):
# XXX: this is the same before and after the attributes disappear
print id(self)
# XXX: print the list of attributes to see what disappears
print dir(self)
# XXX: this works until the _xxx_my_parent attribute disappears
print self._xxx_my_parent

如果您好奇,这里是我的 MenuBar 类的完整源代码。这是一个pygtkhelpers SlaveView,继承自GObject。 pygtkhelpers 委托(delegate)将自动信号连接到上面的 on_file_import__activate 方法。

class MenuBar(pygtkhelpers.delegates.SlaveView):        
def __init__(self, parent):
SlaveView.__init__(self)
self.parent = parent

def create_ui(self):
menu_bar = gtk.MenuBar()
menu_bar.set_pack_direction(gtk.PACK_DIRECTION_LTR)

for menu_name, items in self.menu_items:
menu = gtk.Menu()
submenu = gtk.MenuItem(menu_name)
submenu.set_submenu(menu)
for item_name in items:
if not item_name:
menu.append(gtk.MenuItem())
continue
menuitem = gtk.MenuItem(item_name)
fixed_item_name = item_name.lower().replace(' ','_')
fixed_menu_name = menu_name.lower().replace(' ','_')
attr_name = '%s_%s' % (fixed_menu_name,fixed_item_name)
# set an attribute like self.edit_vial_layout
# so pygtkhelpers can find the widget to connect the signal from
setattr(self,attr_name,menuitem)
menu.append(menuitem)
menu_bar.append(submenu)
self.vbox = gtk.VBox()
self.vbox.pack_start(menu_bar)
self.vbox.show_all()
self.widget.add(self.vbox)

从对象中消失的属性列表:

'_model', '_props', '_toplevel', '_xxx_my_parent', 'file_import', 'parent', 'slaves', 'testtesttest', 'vbox', 'widget'

parent 属性是最初消失的;我尝试将其值分配给 _xxx_my_parentManagerWindowMenu.__init__() 但它也消失了。我还在 MenuBar.__init__ 中添加了一个我从未访问过的新属性,称为 testtesttest,它也消失了。

最佳答案

请记住,PyGTK 中的对象通常继承自 GObject。 GObject 框架内可能发生了导致您丢失属性的事件。

关于python - 如何找出 Python 对象丢失属性的原因/时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5346578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com