python - 如何允许自定义类参数在 ipython 中以制表符完成?

标签 python python-2.7 pandas ipython jupyter-notebook

例如,如果我有以下类(class)

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__() 方法,如 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 添加到函数 add_dimension() 内的列表 self._morelements 中。

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

关于python - 如何允许自定义类参数在 ipython 中以制表符完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22540117/

相关文章:

python - 控制 Raspberry Pi 和 Python 上的 USB 网络摄像头照片捕获时间

Python 数据帧 : Merging two dataframes according to a condition (Pandas)

python - 使用 Pandas 动态替换其他列中的值

python - 如何使用 safe_load 使用 PyYAML 反序列化对象?

python - 网络抓取 imd 网站的一些问题

Python 2.7 : check if default argument passed with a decorator

python - 捕获视频的颜色直方图均衡

c++ - 如何在caffe中提取图层的blob信息?

python - 如何根据Python中其他列的多个条件设置列的值?

python - Pandas 数据框过滤多个条件