我希望在IPython中控制自定义对象的制表符补全时显示哪些方法,特别是我想隐藏已经过时的函数。我仍然希望这些方法是可调用的,但如果用户检查该对象,我不希望他们看到并开始使用它们。这是可能的吗?
以下是部分答案。我将发布示例代码,然后解释为什么它只是部分答案。
代码:
class hidden(object): # or whatever its parent class is
def __init__(self):
self.value = 4
def show(self):
return self.value
def change(self,n):
self.value = n
def __getattr__(self, attrname):
# put the dep'd method/attribute names here
deprecateds = ['dep_show','dep_change']
if attrname in deprecateds:
print("These aren't the methods you're looking for.")
def dep_change(n):
self.value = n
def dep_show():
return self.value
return eval(attrname)
else:
raise AttributeError, attrname
__getattr__
中定义每个已弃用的函数。这不会影响您的其他属性查找(如果我将它们放在__getattribute__
中,那就是另一回事了),但它会减慢对这些已弃用方法的访问速度。这可以通过将每个函数定义放入其自己的if块中而不是进行列表成员检查来(在很大程度上,但并非完全)消除,但是,根据您的函数大小,这可能很难维护。import types
return types.MethodType(eval(attrname), self)
替代
return eval(attrname)
class hidden(object):
def __init__(self):
self.value = 4
from types import MethodType
def dep_show(self):
return self.value
self.__setattr__('dep_show', MethodType(dep_show, self))
def dep_change(self, n):
self.value = n
self.__setattr__('dep_change', MethodType(dep_change, self))
def show(self):
return self.value
def change(self, n):
self.value = n
def __dir__(self):
heritage = dir(super(self.__class__, self)) # inherited attributes
hide = ['dep_show', 'dep_change']
show = [k for k in self.__class__.__dict__.keys() + self.__dict__.keys() if not k in heritage + private]
return sorted(heritage + show)
__dir__
方法可以隐藏 dir(hiddenObj)
和 IPython 的选项补全中弃用的内容,但它们仍会存在于实例的 __dict__
属性中,用户仍然可以发现它们。DeprecationWarning
直到调用方法时才会发出,因此您必须在类上拥有一个单独的属性来存储已弃用方法的名称,然后在建议完成之前检查该属性。
或者,您可以遍历方法的 AST 寻找 DeprecationWarning
,但如果类是在 C 中定义的,或者如果方法基于参数的类型或值可能会发出 DeprecationWarning
,则此方法将失败。
rlcompleter
有关。http://docs.python.org/library/rlcompleter.html - Ignacio Vazquez-Abramshttp://ipython.scipy.org/doc/manual/html/api/generated/IPython.core.completer.html#ipcompleter
但是一个真正有趣的例子是traits completer,它恰好做了你想要做的事情:根据方法名称隐藏某些方法以避免自动完成。
以下是代码: