如何在ipython中允许自定义Class参数完成选项卡?

时间:2014-03-20 17:01:12

标签: python python-2.7 pandas ipython ipython-notebook

例如,如果我有以下类

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中列名的工作方式。

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

你可以。您必须为您的课程实施__dir__()方法,如here所述。

这是一个有效的例子:

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,您将拥有ab可用的成员,但b不存在。

__dir__()的代码以及对这种方法的局限性的讨论是here。在您的情况下,您希望将description添加到函数self._morelements内的列表add_dimension()

编辑: 当然,您还需要在self._morelements=[]中初始化__init__(),并将上述示例的__dir__()函数添加到您的班级Part

答案 1 :(得分:0)

解释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不存在。

this_is_a_dimension

a属性仅在运行时和行之后存在:

a.add_dimension('this_is_a_dimension',1.00,0.05)

为了完成你想要的,你需要一些在编辑时解释python代码的IDE。