我会首先尝试用词。使用Python 3,我有一个主要功能,将arg设置为变量。当main()运行时,它调用一个调用其他函数的复制函数。在运行这些其他函数之后,copy()需要在开始时由main()设置的arg变量完成并允许main()完成。
据我所知,arg变量是main()的本地变量。从函数外部调用arg会返回NameError。
我正在考虑这个想法“我应该能够从copy()调用arg变量,因为我正在运行调用copy()的main()。
我一直到达NameError。在我希望main函数结束之前我调用的最后一个函数想知道arg持有什么但是不能识别arg如何定义。
假设所有其他必要的东西都在工作,那么必须做什么才能让copy()识别出定义的arg。
...
def copy():
x = destination()
if os.path.isdir(x):
y = backup_destination()
if not os.path.isdir(y):
shutil.copytree(arg.source, backup_destination)
shutil.rmtree(x)
shutil.copytree(arg.source, x)
def main():
parser = argparse.ArgumentParser()
parser.add_argument('-s', '--source', type = str)
arg = parser.parse_args()
if os.path.isdir(arg.source):
copy()
...
if __name__ == '__main__':
main()
答案 0 :(得分:3)
该变量是main
函数的本地变量,要在copy
中使用它,您必须将其作为参数传递,或使其成为全局变量。尽量避免使用后者,除非你确定需要它,使用全局变量会导致许多难以调试的问题,因为你忘记的函数改变了变量。
def copy(arg):
x = destination()
if os.path.isdir(x):
y = backup_destination()
if not os.path.isdir(y):
shutil.copytree(arg.source, backup_destination)
shutil.rmtree(x)
shutil.copytree(arg.source, x)
def main():
parser = argparse.ArgumentParser()
parser.add_argument('-s', '--source', type = str)
arg = parser.parse_args()
if os.path.isdir(arg.source):
copy(arg)
if __name__ == '__main__':
main()
阅读this以获取有关python中变量作用域的更多信息。
答案 1 :(得分:1)
每个功能都在不同的框架中运行。尝试在每个函数中打印locals()
以查看局部变量。
有两种方法可以访问args:
首先,正常且正确的做事方式:将其作为参数提交给copy()
:
def copy(arg):
...
def main():
copy(arg)
其次,糟糕的做事方式:使用sys._getframe(1)
分析顶部框架:
def copy():
args = sys._getframe(1).f_locals["args"]
print(args())
def main():
args = 1234
copy()
>>> main()
1234
关于从不同范围获取变量,我相信你错误地使用了这段代码:
def main():
arg = 1234
def code():
print(arg)
code()
在这里,由于函数是在另一个函数中定义的,因此它可以访问它的局部变量。