gpt4 book ai didi

python - 在 ipython 控制台中处理用户定义的类时出现错误

转载 作者:行者123 更新时间:2023-12-01 01:53:06 25 4
gpt4 key购买 nike

首先我应该说我正在使用Python 3.5.2。当我定义自己的类时,我认为 ipython 有问题。因此,当我在标准 python 控制台中运行以下代码时,我没有收到错误:

class A(dict):
def __getattribute__(self, item):
return self[item]
a = A({'x' : 1})
a['x']

但是当我在 ipython 控制台中运行上述代码时,出现以下错误:

KeyError                                  Traceback (most recent call last)
/usr/local/lib/python3.5/dist-packages/IPython/core/prefilter.py in prefilter_lines(self, lines, continue_prompt)
333 for lnum, line in enumerate(llines) ])
334 else:
--> 335 out = self.prefilter_line(llines[0], continue_prompt)
336
337 return out

/usr/local/lib/python3.5/dist-packages/IPython/core/prefilter.py in prefilter_line(self, line, continue_prompt)
308 return normal_handler.handle(line_info)
309
--> 310 prefiltered = self.prefilter_line_info(line_info)
311 # print "prefiltered line: %r" % prefiltered
312 return prefiltered

/usr/local/lib/python3.5/dist-packages/IPython/core/prefilter.py in prefilter_line_info(self, line_info)
250 """
251 # print "prefilter_line_info: ", line_info
--> 252 handler = self.find_handler(line_info)
253 return handler.handle(line_info)
254

/usr/local/lib/python3.5/dist-packages/IPython/core/prefilter.py in find_handler(self, line_info)
257 for checker in self.checkers:
258 if checker.enabled:
--> 259 handler = checker.check(line_info)
260 if handler:
261 return handler

/usr/local/lib/python3.5/dist-packages/IPython/core/prefilter.py in check(self, line_info)
414 def check(self, line_info):
415 obj = self.shell.user_ns.get(line_info.ifun)
--> 416 if isinstance(obj, Macro):
417 return self.prefilter_manager.get_handler_by_name('macro')
418 else:

<ipython-input-1-cb6806333b6b> in __getattribute__(self, item)
1 class A(dict):
2 def __getattribute__(self, item):
----> 3 return self[item]
4

KeyError: '__class__'

如果您对此问题有任何想法,请提供帮助。

最佳答案

看起来 IPython 正在尝试访问 a.__class__,但失败了。它可能是为了诊断目的而将其作为某种标准的对象扫描来执行的。如果您尝试 print(a.__class__),您会在常规 Python 控制台中收到相同的错误。

您的__getattribute__应该有一个后备,以防字典中没有与该键匹配的条目。 the documentation如果您需要访问实际属性,建议调用基类的 __getattribute__ 方法。像这样的东西:

class A(dict):
def __getattribute__(self, item):
if item in self:
return self[item]
else:
return object.__getattribute__(self, item)
#or possibly:
#return super().__getattribute__(item)
#... Depending on one's interpretation of "base class"

a = A({'x' : 1})
a['x']
print(a.__class__)

覆盖__getattr__也可能有意义。而不是__getattribute__。这样,仍然可以访问对象的所有属性,而无需在函数中对它们进行任何显式检查。

class A(dict):
def __getattr__(self, item):
if item in self:
return self[item]
else:
raise AttributeError

a = A({'x' : 1})
a['x']
print(a.__class__)

关于python - 在 ipython 控制台中处理用户定义的类时出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50529556/

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