Odpowiedzi:
Ostatecznie różnica między try, excepttestowaniem a testowaniem len(sys.argv)nie jest aż tak znacząca. W porównaniu z nimi oba są nieco hakerskie argparse.
Wydaje mi się to jednak - jako swego rodzaju argument niskobudżetowy:
arg_names = ['command', 'x', 'y', 'operation', 'option']
args = dict(zip(arg_names, sys.argv))
Możesz nawet użyć go do wygenerowania a namedtuplez wartościami domyślnymi None- wszystko w czterech wierszach!
Arg_list = collections.namedtuple('Arg_list', arg_names)
args = Arg_list(*(args.get(arg, None) for arg in arg_names))
Jeśli nie jesteś zaznajomiony z tym namedtuple, jest to po prostu krotka, która działa jak obiekt, umożliwiając dostęp do jego wartości za pomocą tup.attributeskładni zamiast tup[0]składni.
Więc pierwsza linia tworzy nowy namedtupletyp z wartościami dla każdej z wartości w arg_names. Druga linia przekazuje wartości ze argssłownika, używając getdo zwrócenia wartości domyślnej, gdy podana nazwa argumentu nie ma skojarzonej wartości w słowniku.
Sprawdź długość sys.argv:
if len(sys.argv) > 1:
blah = sys.argv[1]
else:
blah = 'blah'
Niektórzy wolą zaproponowane przez Ciebie podejście oparte na wyjątkach (np. try: blah = sys.argv[1]; except IndexError: blah = 'blah'), Ale nie podoba mi się to tak bardzo, ponieważ nie „skaluje się” prawie tak dobrze (np. Gdy chcesz zaakceptować dwa lub trzy argumenty) i może potencjalnie ukryć błędy (np. jeśli użyłeś blah = foo(sys.argv[1]), ale foo(...)wywołałeś IndexError, IndexErrorto zostanie zignorowane).
try, except. Po prostu poczekaj na fooswój argument do elseklauzuli.
argparse.
argparse.pywszystkie moje projekty wiersza poleceń.
trywynika, że większość programistów nie jest sumienna i umieszcza całą logikę w klauzuli… Więc biorąc pod uwagę, że nie jest to trudniejsze (i IMO, trochę ładniejsze), wolę po prostu sprawdzić długość (również unikasz posiadania ludzi krzyczą na ciebie za używanie wyjątków do kontroli przepływu).
tryprzyznać, że jestem trochę apologetą. Po prostu czuję, że czasami jaśniej wyraża moje zamiary niż ifstwierdzenie.
Innym sposobem, którego jeszcze nie widziałem na liście, jest ustawienie wartości wartowniczej z wyprzedzeniem. Ta metoda wykorzystuje leniwą ocenę języka Python, w której nie zawsze musisz podawać elseinstrukcję. Przykład:
startingpoint = 'blah'
if len(sys.argv) >= 2:
startingpoint = sys.argv[1]
Lub jeśli zamierzasz składać CRAZY, możesz użyć potrójnego operatora Pythona :
startingpoint = sys.argv[1] if len(sys.argv) >= 2 else 'blah'
Używam tego - nigdy nie zawodzi:
startingpoint = 'blah'
if sys.argv[1:]:
startingpoint = sys.argv[1]
startingpointzmienną z przykładu, ale pytanie dotyczy przypisania zmiennej rezerwowej, więc zrobiłem to samo.
sys.argv[1:]:. Działa to z argumentami pozycyjnymi, podczas gdy count nie.
To zwykła lista w Pythonie. Wyjątkiem, który można by złapać w tym przypadku, jest IndexError, ale zamiast tego lepiej po prostu sprawdzić długość.
if len(sys.argv) >= 2:
startingpoint = sys.argv[1]
else:
startingpoint = 'blah'
Rozwiązanie działające z wbudowaną funkcją mapy!
arg_names = ['command' ,'operation', 'parameter']
args = map(None, arg_names, sys.argv)
args = {k:v for (k,v) in args}
Następnie wystarczy wywołać parametry w ten sposób:
if args['operation'] == "division":
if not args['parameter']:
...
if args['parameter'] == "euclidian":
...
Możesz po prostu dodać wartość argv [1] do argv, a następnie sprawdzić, czy argv [1] nie jest równe wprowadzonemu łańcuchowi Przykład:
from sys import argv
argv.append('SomeString')
if argv[1]!="SomeString":
print(argv[1])