如何使模块导入已导入模块的模块

时间:2019-12-22 16:42:13

标签: python python-3.x python-import nameerror

我经常发现自己想在运行代码时通过打印某些功能来测试某些功能。我喜欢使用f字符串使输出更具描述性。像这样:

foo = 2
bar = 5
print(f'foo * bar = {foo * bar}')

输出foo * bar = 10。很好,但是制作一个可以随时导入并自动为我完成的模块真的很方便。像这样:

eval_print.py

def eval_print(function_as_str):
    print(f'{function_as_str} = {eval(function_as_str)}')

if __name__ == '__main__':
    eval_print('2 + 2')

这很好,直到我真正导入它为止。我在这里遇到了问题:

celsius.py:

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

2 个答案:

答案 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

不确定如何执行变量,但我会继续考虑。