pycallgraph的非图形输出

Unapiedra

我已经开始编写一个小的Python实用程序来缓存功能。可用的缓存工具(lru_cache烧杯)无法检测到子功能的更改。

为此,我需要一个调用图存在着一个极好的工具pycallgraph杰拉尔德Kaszuba但是,到目前为止,我只能输出功能名称字符串。我需要的是函数对象函数代码哈希。

我用这两个术语的意思是:让def foo(x): return x,然后foo是功能对象,然后hash(foo.__code__.co_code)功能代码哈希

我有的

你可以在这里看到我的东西但是下面是一个最小的示例。在此示例中,我遇到的问题是我无法再从函数名称(字符串)转到函数定义。我正在尝试eval(func)

因此,我想有两种解决方法:

  1. 正确pycallgraph.output,或者通过其他方式直接从Pycallgraph获得我想要的东西。
  2. function.__name__字符串动态加载函数

import unittest
from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutput

class Callgraph:
    def __init__(self, output_file='callgraph.png'):
        self.graphviz = GraphvizOutput()
        self.graphviz.output_file = output_file

    def execute(self, function, *args, **kwargs):
        with PyCallGraph(output=self.graphviz):
            ret = function(*args, **kwargs)

        self.graph = dict()
        for node in self.graphviz.processor.nodes():
            if node.name != '__main__':
                f = eval(node.name)
                self.graph[node.name] = hash(f.__code__.co_code)
        return ret

    def unchanged(self):
        '''Checks each function in the callgraph whether it has changed.
        Returns True if all the function have their original code-hash. False otherwise.
        '''
        for func, codehash in self.graph.iteritems():
            f = eval(func)
            if hash(f.__code__.co_code) != codehash:
                return False
        return True

def func_inner(x):
    return x
def func_outer(x):
    return 2*func_inner(x)

class CallgraphTest(unittest.TestCase):
    def testChanges(self):
        cg = Callgraph()
        y = cg.execute(func_outer, 3)
        self.assertEqual(6, y)
        self.assertTrue(cg.unchanged())
        # Change one of the functions
        def func_inner(x):
            return 3+x
        self.assertFalse(cg.unchanged())
        # Change back!
        def func_inner(x):
            return x
        self.assertTrue(cg.unchanged())


if __name__ == '__main__':
    unittest.main()
Unapiedra

我已经通过修补tracer.py适当的哈希值解决了这一问题

         # Work out the current function or method
         func_name = code.co_name
+        func_hash = hash(code.co_code)

我正在计算的值正好保存在函数名中。稍后,您显然还需要保存该值。我使用字典func_name作为键,哈希是值。在创建节点的函数中,我将其分配给中的新字段stat_group

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

pycallgraph的非图形输出

来自分类Dev

图形输出变量matlab

来自分类Dev

Facebook图形JSON输出

来自分类Dev

Python控制函数的图形输出

来自分类Dev

如何仅输出图形的子集?

来自分类Dev

如何测试功能的图形输出?

来自分类Dev

生成的图形提供了意外的输出

来自分类Dev

Matlab图形的输出位置

来自分类Dev

如何从终端输出python图形?

来自分类Dev

非GUI图形的哪个线程?

来自分类Dev

非GUI图形的哪个线程?

来自分类Dev

使用systemd的非图形启动

来自分类Dev

从MS Access中提取数据并输出图形

来自分类Dev

A *图形算法给出错误的输出

来自分类Dev

功能gammamixEM(包装mixtools)的密度的图形输出

来自分类Dev

Streamlit(无数据的图形输出)

来自分类Dev

如何包括图形输出以起作用

来自分类Dev

tsung输出的含义(图形用户同时)

来自分类Dev

A *图形算法给出错误的输出

来自分类Dev

Shiny R中没有输出图形

来自分类Dev

直方图归一化图形输出

来自分类Dev

Gnuplot的后记终端中无图形输出

来自分类Dev

如何使用图形库输出 Java Applet?

来自分类Dev

pycallgraph与pycharm不起作用

来自分类Dev

如何安装PyCallGraph /使用pip?

来自分类Dev

非数值输出的热散点图

来自分类Dev

sklearn svm非整数输出

来自分类Dev

如何直接访问图形卡的输出?

来自分类Dev

文本输出Sublime Text使用的底层图形库是什么?