[英]How to allow custom Class parameter to be tab-completed in ipython?
例如,如果我有以下课程
class Part(object):
def __init__(self,part_number,description,rev=None,color=None):
self.dims = {}
self.dim_id = 0
self.rev = rev
if type(color) is tuple:
self.color=(color[0]/255.,color[1]/255.,color[2]/255.)
else:
self.color = color
def add_dimension(self,description,value,tol,tol_type = 'sym',dwg_sheet = None, dwg_zone = None,quality = 3):
self.dims[description] = Dimension(description=description,part=self,value=value,tol=tol,tol_type=tol_type,quality=quality,dwg_sheet=None,dwg_zone=None)
def __getattr__(self, description):
return self.dims[description]
class Dimension(object):
def __init__(self,part,value,tol,tol_type = 'sym', dwg_sheet = None, dwg_zone = None, quality = 3, description = None):
self.value = value
self.part=part
self.tol = tol
self.tol_type = tol_type
self.description = description
self.quality = quality
self.sigma = self.tol/float(quality)
def __str__(self):
return self.description
然后我运行以下代码:
a = Part('pn','this is a part')
a.add_dimension('this_is_a_dimension',1.00,0.05)
print a.this_is_a_dimension
它返回:
this_is_a_dimension
问题是当我尝试输入“ a.
”后执行制表符补全时,我仅获得以下选项
a.add_dimension
a.color
a.dim_id
a.dims
a.rev
我希望可以使用制表符完成以查看新参数。 这将类似于Pandas Dataframes中列名的工作方式。
有什么想法吗?
您可以。 您必须实现一个__dir__()
方法的类,如讨论在这里 。
这是它工作的一个示例:
class bar(object):
def __init__(self,):
self.a = 4
self._morelements=['b']
def __dir__(self):
return sorted(set(dir(type(self)) + list(self.__dict__) + self._morelements))
foo=bar()
现在,如果您编写foo.
并在Ipython中按TAB键,虽然b
不存在,但您将同时拥有a
和b
这两个成员。
__dir__()
的代码和这种方法的局限性讨论在这里 。 在您的情况下,您想在add_dimension()
函数内部的列表self._morelements
添加description
。
编辑:当然,您还需要在__init__()
初始化self._morelements=[]
,并将上述__dir__()
函数添加到类Part
Python被解释。 因此,它只知道它已经具有解释器的代码。 这样的一个示例是:如果您尝试运行发布的代码,则将在此行收到错误消息:
self.dims[description] = Dimension(description=description,part=self,value=value,tol=tol,tol_type=tol_type,quality=quality,dwg_sheet=None,dwg_zone=None)
错误: 未定义全局名称“ Dimension” 。 那是因为您在之后定义了Dimension
类。 解释器到达该行时,类别Dimension
不存在。
this_is_a_dimension
的属性a
只存在于运行时间和行之后:
a.add_dimension('this_is_a_dimension',1.00,0.05)
为了完成您想要的,您将需要一些IDE在编辑时解释python代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.