簡體   English   中英

python * args沒有被調用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM