Como crio uma função Python com argumentos opcionais?

218

Eu tenho uma função Python que leva vários argumentos. Alguns desses argumentos podem ser omitidos em alguns cenários.

def some_function (self, a, b, c, d = None, e = None, f = None, g = None, h = None):
    #code

Os argumentos datravés hsão cadeias que cada um tem diferentes significados. É importante que eu possa escolher quais parâmetros opcionais devem passar em qualquer combinação. Por exemplo,, (a, b, C, d, e)ou (a, b, C, g, h), ou (a, b, C, d, e, f, ou todos eles (estas são as minhas escolhas).

Seria ótimo se eu pudesse sobrecarregar a função - mas li que o Python não suporta sobrecarga. Tentei inserir alguns dos argumentos int necessários na lista - e obtive um erro de incompatibilidade de argumento.

No momento, estou enviando seqüências de caracteres vazias no lugar dos primeiros argumentos ausentes como espaços reservados. Eu gostaria de poder chamar uma função usando apenas valores reais.

Há alguma maneira de fazer isso? Eu poderia passar uma lista em vez da lista de argumentos?

No momento, o protótipo usando ctypes se parece com:

_fdll.some_function.argtypes = [c_void_p, c_char_p, c_int, c_char_p, c_char_p, c_char_p, c_char_p, c_char_p]
Thalia
fonte

Respostas:

194

Tente chamar-lo como: obj.some_function( '1', 2, '3', g="foo", h="bar" ). Após os argumentos posicionais necessários, você pode especificar argumentos opcionais específicos por nome.

Russell Borogove
fonte
245

Basta usar o *argsparâmetro, que permite que você passe quantos argumentos desejar após o seu a,b,c. Você precisaria adicionar alguma lógica ao mapa args-> c,d,e,fmas é uma "maneira" de sobrecarregar.

def myfunc(a,b, *args, **kwargs):
   for ar in args:
      print ar
myfunc(a,b,c,d,e,f)

E imprimirá valores de c,d,e,f


Da mesma forma, você pode usar o kwargsargumento e, em seguida, pode nomear seus parâmetros.

def myfunc(a,b, *args, **kwargs):
      c = kwargs.get('c', None)
      d = kwargs.get('d', None)
      #etc
myfunc(a,b, c='nick', d='dog', ...)

E então kwargsteria um dicionário de todos os parâmetros que são importantes apósa,b

Nix
fonte
Obrigado. Embora eu não possa usar tanta flexibilidade no meu código e não resolva meu problema de chamar com vários buracos vazios na minha lista, é uma ótima ferramenta para ser usada em um projeto diferente. e Russel Borogove me deu a resposta exata que eu precisava para o meu problema, estou feliz.
Thalia
12
É chamado de Lista de Argumentos Arbitrários
FabienB
@ Nix, eu realmente gosto da sua resposta. No entanto, você poderia esclarecer para que c = kwargs.get('c', None)serve a declaração ? É necessário em todas as funções que possuem argumentos opcionais? No seu código, você tinha apenas 2 argumentos opcionais. E se o usuário quiser outro argumento e? Como posso alterar seu código de exemplo para qualquer número desconhecido de argumentos opcionais, por exemplo def my_func(a, b, *args, **kwagars): obj = <do something with a & b> obj.add(c) obj.add(d) continue obj.add(for e, f, g...):? Preciso incluir c = kwargs.get('c', None) etcantes de fazer o obj.add(c, d, ...)?
Nemo
Se você está preocupado com a complexidade do tempo. Isso seria um problema
NduJay