Python:导入的模块可以使用本地定义的模块吗?

qvtsj1bj  于 2023-06-25  发布在  Python
关注(0)|答案(2)|浏览(117)

我有一个脚本(myScript.py),它使用了在其内部定义的函数的组合,例如:printStatements(),以及从同一目录下的config.py文件导入的函数,例如myTask()
我希望导入的myTask()函数引用本地定义的printStatements()函数,但在运行时收到NameError: printStatements() is not defined消息。我该如何组织这个?
打印行为因脚本而异,因此这需要定制&相对于定义它的文件。我无法将printStatements()导入到config.py文件中,因为我有多个使用config.py文件的脚本,每个脚本都有自己的printStatements()函数。
编辑-一些示例代码:
config.py

def myTask(m, x, c):
    y = (m*x) + c
    printStatements("y: {}".format(y))

myScript.py

import config as cnfg
def printStatements(mymsg):  
    print(mymsg)

cnfg.myTask(3, 2, 4)

错误:NameError: name printStatements is not defined.

yvt65v4c

yvt65v4c1#

最简单、最清晰的选择是将print函数和参数一起传递给myTask,正如注解中所建议的那样:

def myTask(printer, m, x, c):
    y = (m*x) + c
    printer("y: {}".format(y))

然后

from config import myTask

def printStatements(mymsg):
    print(mymsg)

myTask(printStatements, 3, 2, 4)

myScript.py中。
如果你觉得这是额外的“工作”,那么每次都把函数写为第一个参数:它使我们更清楚地了解正在做什么。可能还有其他方法,但在我看来,这些方法在幕后做得太多了:显性比隐性好。

zpf6vheq

zpf6vheq2#

如果你要多次调用myTask(),你可能不倾向于将它作为参数传递。另一种方法是使用类。

class Wrapper():
  def __init__(self, printStatements):
    self.printStatements = printStatements
  
  def myTask(m, x, c):
    y = (m*x) + c
    self.printStatements("y: {}".format(y))

相关问题