Respostas:
No final, a diferença entre try, excepte o teste len(sys.argv)não é tão significativa. Ambos são um pouco hackeados em comparação com argparse.
Isso me ocorre, porém - como uma espécie de argumento de baixo orçamento:
arg_names = ['command', 'x', 'y', 'operation', 'option']
args = dict(zip(arg_names, sys.argv))
Você pode até mesmo usá-lo para gerar um namedtuplecom valores padrão None- tudo em quatro linhas!
Arg_list = collections.namedtuple('Arg_list', arg_names)
args = Arg_list(*(args.get(arg, None) for arg in arg_names))
Caso você não esteja familiarizado namedtuple, é apenas uma tupla que atua como um objeto, permitindo que você acesse seus valores usando tup.attributesintaxe em vez de tup[0]sintaxe.
Portanto, a primeira linha cria um novo namedtupletipo com valores para cada um dos valores em arg_names. A segunda linha passa os valores do argsdicionário, usando getpara retornar um valor padrão quando o nome do argumento fornecido não tem um valor associado no dicionário.
Verifique o comprimento de sys.argv:
if len(sys.argv) > 1:
blah = sys.argv[1]
else:
blah = 'blah'
Algumas pessoas preferem a abordagem baseada em exceções que você sugeriu (por exemplo, try: blah = sys.argv[1]; except IndexError: blah = 'blah'), mas eu não gosto tanto porque ela não "escala" tão bem (por exemplo, quando você quer aceitar dois ou três argumentos) e pode potencialmente ocultar erros (por exemplo, se você usou blah = foo(sys.argv[1]), mas foo(...)levantou um IndexError, isso IndexErrorseria ignorado).
try, except. Apenas espere fooseu argumento até a elsecláusula.
argparse.
argparse.pyem todos os meus projetos de linha de comando.
trycláusula ... Então, dado que não é mais difícil (e, IMO, um pouco mais bonito), prefiro apenas verificar o comprimento (também, você evita ter pessoas gritar com você por usar exceções para controle de fluxo).
tryapologista, devo admitir. Só sinto que às vezes expressa minha intenção com mais clareza do que uma ifdeclaração.
Outra maneira que ainda não vi na lista é definir o valor de sentinela com antecedência. Este método tira proveito da avaliação preguiçosa do Python, na qual você nem sempre precisa fornecer uma elseinstrução. Exemplo:
startingpoint = 'blah'
if len(sys.argv) >= 2:
startingpoint = sys.argv[1]
Ou se você usar a sintaxe CRAZY, poderá usar o operador ternário do Python :
startingpoint = sys.argv[1] if len(sys.argv) >= 2 else 'blah'
Eu uso isso - nunca falha:
startingpoint = 'blah'
if sys.argv[1:]:
startingpoint = sys.argv[1]
startingpointvariável do exemplo, mas a questão é atribuir uma variável de fallback, então acabei de fazer o mesmo.
sys.argv[1:]:. Isso funciona com argumentos posicionais, enquanto a contagem não.
É uma lista comum do Python. A exceção que você capturaria para isso é IndexError, mas é melhor verificar apenas o comprimento.
if len(sys.argv) >= 2:
startingpoint = sys.argv[1]
else:
startingpoint = 'blah'
Uma solução que trabalha com função de mapa embutido!
arg_names = ['command' ,'operation', 'parameter']
args = map(None, arg_names, sys.argv)
args = {k:v for (k,v) in args}
Então você só precisa chamar seus parâmetros desta forma:
if args['operation'] == "division":
if not args['parameter']:
...
if args['parameter'] == "euclidian":
...
Você pode simplesmente anexar o valor de argv [1] a argv e, em seguida, verificar se argv [1] não é igual à string inserida. Exemplo:
from sys import argv
argv.append('SomeString')
if argv[1]!="SomeString":
print(argv[1])