簡體   English   中英

檢查 sys.argv[x] 是否已定義

[英]Checking if sys.argv[x] is defined

檢查是否為腳本傳遞了變量的最佳方法是什么:

try:
    sys.argv[1]
except NameError:
    startingpoint = 'blah'
else:
    startingpoint = sys.argv[1]

檢查sys.argv的長度:

if len(sys.argv) > 1:
    blah = sys.argv[1]
else:
    blah = 'blah'

有些人更喜歡你建議的基於異常的方法(例如, try: blah = sys.argv[1]; except IndexError: blah = 'blah' ),但我不太喜歡它,因為它不“縮放”幾乎一樣好(例如,當您想要接受兩個或三個參數時)並且它可能隱藏錯誤(例如,如果您使用blah = foo(sys.argv[1]) ,但是foo(...)引發了一個IndexError ,該IndexError將被忽略)。

最后, try, except和 testing len(sys.argv)之間的區別並不是那么重要。 argparse相比,它們都有點hackish。

不過,這發生在我身上——作為一種低預算的 argparse:

arg_names = ['command', 'x', 'y', 'operation', 'option']
args = dict(zip(arg_names, sys.argv))

您甚至可以使用它來生成一個namedtuple ,其值默認為None —— 全部在四行中!

Arg_list = collections.namedtuple('Arg_list', arg_names)
args = Arg_list(*(args.get(arg, None) for arg in arg_names))

如果您不熟悉namedtuple ,它只是一個充當對象的元組,允許您使用tup.attribute語法而不是tup.attribute tup[0]語法訪問其值。

因此,第一行創建了一個新的namedtuple類型,其中包含arg_names每個值的值。 第二行傳遞args字典中的值,當給定的參數名稱在字典中沒有關聯值時,使用get返回默認值。

我還沒有看到列出的另一種方法是提前設置您的哨兵值。 這種方法利用了 Python 的惰性求值,您不必總是在其中提供else語句。 例子:

startingpoint = 'blah'
if len(sys.argv) >= 2:
  startingpoint = sys.argv[1]

或者,如果您要語法 CRAZY,則可以使用 Python 的三元運算符

startingpoint = sys.argv[1] if len(sys.argv) >= 2 else 'blah'

我使用這個 - 它永遠不會失敗:

startingpoint = 'blah'
if sys.argv[1:]:
   startingpoint = sys.argv[1]

這是一個普通的 Python 列表。 您會為此捕獲的異常是 IndexError,但您最好只檢查長度。

if len(sys.argv) >= 2:
  startingpoint = sys.argv[1]
else:
  startingpoint = 'blah'

非常接近發起者試圖做的事情。 這是我使用的一個函數:

def get_arg(index):
    try:
        sys.argv[index]
    except IndexError:
        return ''
    else:
        return sys.argv[index]

所以用法是這樣的:

if __name__ == "__main__":
    banner(get_arg(1),get_arg(2))

使用地圖內置功能的解決方案!

arg_names = ['command' ,'operation', 'parameter']
args = map(None, arg_names, sys.argv)
args = {k:v for (k,v) in args}

然后你只需要像這樣調用你的參數:

if args['operation'] == "division":
    if not args['parameter']:
        ...
    if args['parameter'] == "euclidian":
        ...

您可以簡單地將 argv[1] 的值附加到 argv,然后檢查 argv[1] 是否不等於您輸入的字符串示例:

from sys import argv
argv.append('SomeString')
if argv[1]!="SomeString":
            print(argv[1])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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