我想我误解了如何调用其他函数的变量

时间:2016-09-19 20:37:58

标签: python python-3.x

我会首先尝试用词。使用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()

2 个答案:

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

在这里,由于函数是在另一个函数中定义的,因此它可以访问它的局部变量。