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 d
através h
sã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]
Respostas:
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.fonte
Basta usar o
*args
parâmetro, que permite que você passe quantos argumentos desejar após o seua,b,c
. Você precisaria adicionar alguma lógica ao mapaargs
->c,d,e,f
mas é uma "maneira" de sobrecarregar.E imprimirá valores de
c,d,e,f
Da mesma forma, você pode usar o
kwargs
argumento e, em seguida, pode nomear seus parâmetros.E então
kwargs
teria um dicionário de todos os parâmetros que são importantes apósa,b
fonte
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 argumentoe
? Como posso alterar seu código de exemplo para qualquer número desconhecido de argumentos opcionais, por exemplodef 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 incluirc = kwargs.get('c', None) etc
antes de fazer oobj.add(c, d, ...)
?