【问题标题】:How can you pass a docstring to a wrapper function in python?如何将文档字符串传递给 python 中的包装函数?
【发布时间】:2020-04-15 20:52:26
【问题描述】:

如果我有一个包装另一个对象的类(比如说 Pandas 数据框),我如何将文档字符串从包装类传递给包装类?

例如在下面的代码中:

import pandas as pd

class DataframeWrapper():
    def __init__(self, df):
        self.df = df

    def plot(self, *args, **kwargs):
        self.df.plot(*args, **kwargs)

df1 = pd.DataFrame(data=np.random.normal(0,1, size=(10,2)), columns=['a', 'b'])
wdf1 = DataframeWrapper(df1)
wdf1.plot('a', 'b')

如何让包装类中的绘图函数具有与 Pandas 绘图相同的文档字符串(以便可以通过按 shift+tab 在 Jupyter 中看到它)?

【问题讨论】:

  • 您可以使用对象上的__doc__ 属性访问文档字符串。它们是可写的。
  • 如何将该文档分配给包装函数的绘图方法?
  • self.plot.__doc__ = df.plot.__doc__
  • 这给了我一个错误:AttributeError: attribute '__doc__' of 'method' objects is not writable。我将此行添加到构造函数的末尾。
  • 嗯..让我试试这个..

标签: python


【解决方案1】:

好吧..把这个放在这里,这样你就可以看到我的骇人听闻的想法了..它似乎有效,但不知道它是否那么漂亮......在这里......

>>> class DataframeWrapper():
...     def __init__(self, df):
...         self.df = df
...         
...         @functools.wraps(df.plot)
...         def _plot(*args, **kwargs):
...             return df.plot(*args, **kwargs)
...             
...         self.plot = _plot

在我的 shell 中尝试一下,一个巨大的文档字符串框填满了我的屏幕。这与以另一种方式声明的方法差不多。您可以访问其中的 self 以及托管的数据框。

这基本上和装饰器做的事情一样。您可以为您感兴趣的每个数据框方法声明函数并将它们分配给__init__() 中的属性。

更进一步,我们可以创建一个装饰器样式函数。

>>> def dfwrap(method):
...     @functools.wraps(method)
...     def _dfwrap(*args, **kwargs):
...         # Do some extra stuff here...
...         return method(*args, **kwargs)
...     return _dfwrap

然后在__init__():

...     self.foo = dfwrap(df.foo)
...     self.bar = dfwrap(df.bar)
...     self.baz = dfwrap(df.baz)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-25
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多