我试图以高效和Pythonic的方式在类(包括它们的初始化器)和方法中实现重复的功能。
我是子类化和重写方法(如here所示)。我在每个班级都有计数器定义和增强的作业。
我的代码
class StructuralAnalysis(object):
def __init__(self):
self.counter_results = [] # probably a dict would be better
def generate_structural_metrics(self):
# declare counters
cnum = 0
cstr = 0
cbytes = 0
...
...
...
for node in ast.walk(self.tree):
if isinstance(node, ast.Num):
cnum += 1
elif isinstance(node, ast.Str):
cstr += 1
elif isinstance(node, ast.Bytes):
cbytes += 1
elif ...
elif ...
elif ...
self.counter_results = [cnum, cstr, cbytes, .......]
# some counters may require some further calculations
return self.counter_results
我的问题是上述是否可以以更加Pythonic和/或更有效的方式实施;比如为每个计数器设置一个不同的类方法,每个重写的方法都会调用它来执行增强的赋值?这是为了避免大量的计数器声明和重复的代码。任何建议都会很棒。
答案 0 :(得分:1)
我不会使用一堆类,因为开销可能太大了(假设大多数只保留一个计数器,对于那种类型)。
但是,我会检查是否有办法通过函数获取ast类型(因此不是isinstance的布尔值,而是类型(var)。当你有ast类型时,你可以使用你已经拥有的字典作为写点像
的想法counters = {}
for node in ast.walk(self.tree):
counters[type(node)] += 1
这将迭代所有节点并将计数器添加到字典中。
对于其他计算,您可以制作另一个字典:
counter_calculations = {}
counter_calculations[ast.BYTE] = perform_additional_calculations_byte
对于每种类型,如果需要函数,请添加函数引用。这样,您可以非常轻松地调用类型所需的额外计算(您可以在同一个迭代器中使用它)。
if (type(node) in counter_calculations:
counter_calculations[type(node)]()
然后实现这些函数,例如一个字节:
def perform_additional_calculations_byte(byte_node):
... some calculations
对于要返回的计数器结果,您可以返回计数器字典。