我经常发现自己想在运行代码时通过打印某些功能来测试某些功能。我喜欢使用f字符串使输出更具描述性。像这样:
foo = 2
bar = 5
print(f'foo * bar = {foo * bar}')
输出foo * bar = 10
。很好,但是制作一个可以随时导入并自动为我完成的模块真的很方便。像这样:
def eval_print(function_as_str):
print(f'{function_as_str} = {eval(function_as_str)}')
if __name__ == '__main__':
eval_print('2 + 2')
这很好,直到我真正导入它为止。我在这里遇到了问题:
from eval_print import eval_print
class Celsius:
def __init__(self, temperature = 0):
self.temperature = temperature
def to_fahrenheit(self):
return (self.temperature * 1.8) + 32
man = Celsius()
man.temperature = 37
eval_print('man.temperature')
eval_print('man.to_fahrenheit()')
运行celsius.py
给了我一个NameError异常,因为eval_print
无权访问celsius.py
。
有什么方法可以导入导入模块的模块?在这种情况下,我想自动导入celsius.py
或其他任何模块可以将其导入到eval_print.py
。
答案 0 :(得分:2)
您可以编写这样的函数调用日志装饰器(也受到蓝牙答案的启发),然后装饰要检查调用的函数。
crashlytics {
enableNdk true
// If using the Android plugin for Gradle version 2.2.0+ with the externalNativeBuild DSL,
// you should remove the androidNdkOut and androidNdkLibsOut properties, as these paths will
// automatically be detected by the Fabric plugin.
androidNdkOut 'obj'
androidNdkLibsOut 'libs'
manifestPath 'AndroidManifest.xml'
}
输出:
def log_call(func):
def print_call(*args, **kwargs):
result = func(*args, **kwargs)
args_str = ", ".join(str(arg) for arg in args)
kwargs_str = " " + ", ".join(
f"{key}={value}".format(key, value) for key, value in kwargs.items()
)
print(f"{func.__name__}({args_str},{kwargs_str}) = {result}")
return result
return print_call
@log_call
def add(x, y, offset=0, from_origin=0):
return x + y + offset + from_origin
print(add(1, 2, offset=10, from_origin=5))
答案 1 :(得分:1)
这是实现功能的一种方法。该代码仅用于位置参数,但您可以将其用于命名参数。
def printe(fun, args):
sargs = ', '.join([str(arg) for arg in args])
print(f'{fun.__name__}({sargs}) = {fun(*args)}')
当给定实际函数和参数作为元组时,它将打印出来。
>>> printe(foo, (1,))
foo(1) = 2
问题在于,如果您将一个函数分配给另一个变量,它将不起作用。
>>> bar = foo
>>> printe(bar, (1,))
foo(1) = 2
不确定如何执行变量,但我会继续考虑。