2016-09-19 16 views
0

我會先試試看。使用Python 3,我有一個將arg設置爲變量的主函數。當main()運行時,它會調用一個調用其他函數的複製函數。在這些其他函數運行之後,copy()需要在開始時由main()設置的arg變量完成並允許main()完成。我想我誤解了如何調用其他函數的變量

據我所知,arg變量是main()的本地變量。從函數外部調用arg返回一個NameError。

我在看這個想法:「我應該能夠調用從副本(ARG變量),因爲我正在運行的main(),它是調用複製()。

我一直到達一個NameError。該最終函數在我想要主函數結束之前調用想要知道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() 
+1

函數不共享局部變量。需要時您需要將它們傳遞給對方。 – tcooc

+0

你想定義一個全局變量嗎? – acornagl

回答

3

v易用的是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中變量作用域的更多信息。

+0

謝謝。我有一種感覺,我可以用全局變量來完成它,但我明白爲什麼它們不應該被使用。 –

1

每個函數運行在不同的框架中。嘗試在每個函數中打印locals()以查看本地變量。

有2種方式來訪問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 

關於從廣告獲得的變量ifferent範圍,我相信你是錯與此代碼:

def main(): 
    arg = 1234 
    def code(): 
     print(arg) 
    code() 

在這裏,因爲函數被另一個函數中定義的,它會進入它的局部變量。

相關問題