如何将元数据或注释与python函数或方法相关联



我希望为Python类中的方法构建相当详细的注释。这些注释将用于故障排除、文档、用户界面的工具提示等。但是,尚不清楚如何将这些注释与函数关联起来。

就上下文而言,这是一个功能工程类,因此两个示例方法可能是:

def create_feature_momentum(self):
return self.data['mass'] * self.data['velocity'] * 
def create_feature_kinetic_energy(self):
return 0.5* self.data['mass'] * self.data['velocity'].pow(2)

例如:

  1. 最好能很容易地说出每个工程功能中使用了哪些核心功能
  2. 跟踪每种方法的任意元数据会很好
  3. 最好嵌入非字符串数据作为每个函数的元数据。对样本数据帧的一些示例计算

到目前为止,我一直在手动创建文档字符串,如:

def create_feature_kinetic_energy(self)->pd.Series:
'''Calculate the non-relativistic kinetic energy.
Depends on: ['mass', 'velocity']
Supports NaN Values: False
Unit: Energy (J)
Example: 
self.data= pd.DataFrame({'mass':[0,1,2], 'velocity':[0,1,2]})
self.create_feature_kinetic_energy()
>>> pd.Series([0, 0.5, 4])
'''
return 0.5* self.data['mass'] * self.data['velocity'].pow(2)

然后,我使用regex通过检查__doc__属性来获取有关函数的数据。然而,有没有比__doc__更好的地方可以存储有关函数的信息?在上面的例子中,解析Depends on列表是相当容易的,但在我的用例中,以某种方式将一些示例数据嵌入为数据帧是很好的(我认为在文档字符串中将它们写为markdown会很困难(。

有什么想法吗?

我最终编写了一个类,如下所示:

class ScubaDiver(pd.DataFrame):
accessed = None
def __getitem__(self, key):
if self.accessed is None:
self.accessed = set()
self.accessed.add(key)
return pd.Series(dtype=float)
@property
def columns(self):
return list(self.accessed)

按照我的代码编写方式,我可以这样做:

sd = ScubbaDiver()
foo(sd)
sd.columns

并且CCD_ 4包含CCD_ 5 访问的所有列

尽管这可能在你的代码库中不起作用。

我还写了这个装饰器:

def add_note(notes: dict):
'''Adds k:v pairs to a .notes attribute.'''
def _(f):
if not hasattr(f, 'notes'):
f.notes = {}
f.notes |= notes  # Summation for dicts
return f
return _

您可以按如下方式使用它:

@add_note({'Units':'J', 'Relativity':False})
def create_feature_kinetic_energy(self):
return 0.5* self.data['mass'] * self.data['velocity'].pow(2)

然后你可以做:

create_feature_kinetic_energy.notes['Units']  # J

最新更新