小编sor*_*tai的帖子

exec 和 eval 如何将 __builtins__ 添加到给定环境?

我试图了解 eval 和 exec 如何处理它们所给的环境(全局变量和局部变量),因此我创建了一个类“logdict”,其行为类似于字典,但记录了大多数方法(排除 __new__ ):

from functools import wraps

class LogDict(dict):
    logs = {}
    def _make_wrapper(name):
        @wraps(getattr(dict, name))
        def wrapper(self, *args, **kwargs):
            LogDict.logs.setdefault(id(self), []).append({
                'name': name,
                'args': tuple(map(repr, args)),
                'kwargs': dict((key, repr(kwargs[key])) for key in kwargs)
                })
            return getattr(super(), name)(*args, **kwargs)
        return wrapper

    for attr in dir(dict):
        if callable(getattr(dict, attr)) and attr not in {'__new__',}:
            locals()[attr] = _make_wrapper(attr)

    def logrepr(self):
        return ''.join(
            "{fun}({rargs}{optsep}{rkwargs})\n".format(
                fun = logitem['name'],
                rargs = ', '.join(logitem['args']),
                optsep = ', ' if len(logitem['kwargs'])>0 else '', …
Run Code Online (Sandbox Code Playgroud)

python eval python-3.x

3
推荐指数
1
解决办法
439
查看次数

标签 统计

eval ×1

python ×1

python-3.x ×1