[英]python *args not being called
我有以下代碼,但沒有任何輸出。 我在其中運行了一個pdb,並得到了以下內容:
import tarfile
import sys
def hereweextract(self, *args):
for i in args:
try:
f = tarfile.open(i)
print("Extracting ", i)
f.extractall()
f.close()
except tarfile.ReadError:
sys.exit("File not a tarball, or any of .xz/.bz2/.gz archives.")
if __name__ == "__main__":
hereweextract(sys.argv[1:])
我對此運行了一個pdb,並得到以下信息:
>>> python ll.py file1.tar.xz file2.tar.xz
> /tmp/kk/ll.py(11)<module>()
-> def hereweextract(self, *args):
(Pdb) n
> /tmp/kk/ll.py(22)<module>()
-> if __name__ == "__main__":
(Pdb)
> /tmp/kk/ll.py(23)<module>()
-> hereweextract(sys.argv[1:])
(Pdb)
--Return--
> /tmp/kk/ll.py(23)<module>()->None
-> hereweextract(sys.argv[1:])
(Pdb)
Exception AttributeError: "'NoneType' object has no attribute 'path'" in <function _remove at 0x7f5dc8e596e0> ignored
我不確定為什么會這樣,代碼有什么問題。 它甚至沒有達到“ hereweextract()”函數。 我對如何將args傳遞給函數'hereweextract()'有所了解。
任何人都可以指出這里有什么問題以及我該如何糾正。
##感謝您的所有答案。
這是一個類的一部分,這就是hereweextract()具有自我的原因。 在排除此功能故障時,我完全錯過了它。 謝謝大家指出這一點。
我將其刪除,進行了建議的更改,該函數現在如下所示:
>>> python ll.py file1.tar.xz file2.tar.xz
> /tmp/kk/ll.py(11)<module>()
-> def hereweextract(*args):
(Pdb) n
> /tmp/kk/ll.py(22)<module>()
-> if __name__ == "__main__":
(Pdb)
> /tmp/kk/ll.py(23)<module>()
-> hereweextract(*sys.argv[1:])
(Pdb)
['file1.tar.xz', 'file2.tar.xz']
SystemExit: 'File not a tarball, or any of .xz/.bz2/.gz archives.'
> /tmp/kk/ll.py(23)<module>()
-> hereweextract(*sys.argv[1:])
(Pdb)
--Return--
> /tmp/kk/ll.py(23)<module>()->None
-> hereweextract(*sys.argv[1:])
(Pdb)
File not a tarball, or any of .xz/.bz2/.gz archives.
對於此代碼,我看到以下pdb跟蹤:
>>> python ll.py file1.tar.xz file2.tar.xz > /tmp/kk/ll.py(11)<module>() -> def hereweextract(*args): (Pdb) n > /tmp/kk/ll.py(22)<module>() -> if __name__ == "__main__": (Pdb) > /tmp/kk/ll.py(23)<module>() -> hereweextract(*sys.argv[1:]) (Pdb) ['file1.tar.xz', 'file2.tar.xz'] SystemExit: 'File not a tarball, or any of .xz/.bz2/.gz archives.' > /tmp/kk/ll.py(23)<module>() -> hereweextract(*sys.argv[1:]) (Pdb) --Return-- > /tmp/kk/ll.py(23)<module>()->None -> hereweextract(*sys.argv[1:]) (Pdb) File not a tarball, or any of .xz/.bz2/.gz archives.
我知道在__main__
,我不應該將args作為sys.argv [1:]傳遞,因為它返回了一個列表。 還是我錯了? 我應該在hereweextract()中傳遞什么?
這里有幾處錯誤。 首先,當它不是類中的方法時,您將self
用作函數的第一個參數。 刪除此; 該程序甚至不會得到您說的錯誤。
其次,當將argv[1:]
傳遞給函數時,會將其作為單個參數傳遞:包含要提取的文件名的列表。 但是,編寫函數時要接受多個參數,每個參數都是要提取的文件的名稱。 因此,您的args
包含一個項目,即文件名列表,並且當您遍歷args
您嘗試打開...文件名列表,而不是單個文件名。 文件名列表不是文件名,因此您無法打開它也就不足為奇了。
您的功能應該這樣定義。 (我還擁有清理其他一些事情的自由,例如改進某些名稱,並在遇到第一個錯誤時不停止整個程序,而是繼續到下一個文件。)
def extract_tarfiles(names):
for name in names:
try:
f = tarfile.open(name)
print("Extracting ", name)
f.extractall()
except tarfile.ReadError:
print("File not a tarball, or any of .xz/.bz2/.gz archives.")
finally:
f.close()
嘗試這個:
import tarfile
import sys
def hereweextract(*args):
for i in args:
try:
f = tarfile.open(i)
print("Extracting ", i)
f.extractall()
f.close()
except tarfile.ReadError:
sys.exit("File not a tarball, or any of .xz/.bz2/.gz archives.")
if __name__ == "__main__":
hereweextract(*sys.argv[1:])
在您的代碼中,sys.argv [1:]的內容分配給了自變量。
從hereweextract
的定義中取出您的self
參數。 您正在傳遞sys.argv[1:]
,它是兩個元素(您的文件名)的列表,作為self的參數。 然后,您的*args
元組最終為空。 嘗試在hereweextract
的開頭打印args
,您會看到元組為空。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.