De maneira semelhante ao uso de varargs em C ou C ++:
fn(a, b)
fn(a, b, c, d, ...)
De maneira semelhante ao uso de varargs em C ou C ++:
fn(a, b)
fn(a, b, c, d, ...)
Respostas:
Sim. Você pode usar *args
como um argumento que não é de palavra-chave . Você poderá passar qualquer número de argumentos.
def manyArgs(*arg):
print "I was called with", len(arg), "arguments:", arg
>>> manyArgs(1)
I was called with 1 arguments: (1,)
>>> manyArgs(1, 2, 3)
I was called with 3 arguments: (1, 2, 3)
Como você pode ver, o Python descompactará os argumentos como uma única tupla com todos os argumentos.
Para argumentos de palavras-chave, você precisa aceitá-los como um argumento real separado, conforme mostrado na resposta de Skurmedel .
manyArgs(x = 3)
falha com TypeError
. A resposta de Skumedel mostra a solução para isso. O ponto principal é que a assinatura geral de uma função é f(*list_args, **keyword_args)
(não f(*list_args)
).
args
é tuple
. kwargs
significa palavra-chave args . O tipo de kwargs
é dictionary
.
for arg in args:
para iterar argumentos passados
Adicionando à postagem de desenrolamentos:
Você também pode enviar vários argumentos de valor-chave.
def myfunc(**kwargs):
# kwargs is a dictionary.
for k,v in kwargs.iteritems():
print "%s = %s" % (k, v)
myfunc(abc=123, efh=456)
# abc = 123
# efh = 456
E você pode misturar os dois:
def myfunc2(*args, **kwargs):
for a in args:
print a
for k,v in kwargs.iteritems():
print "%s = %s" % (k, v)
myfunc2(1, 2, 3, banan=123)
# 1
# 2
# 3
# banan = 123
Eles devem ser declarados e chamados nessa ordem, ou seja, a assinatura da função precisa ser * args, ** kwargs e chamada nessa ordem.
print a
com print(a)
e kwargs.iteritems():
com kwargs.items()
.
Se eu puder, o código de Skurmedel é para python 2; adaptá-lo para python 3, a mudança iteritems
para items
e adicionar parênteses para print
. Isso poderia impedir que iniciantes como eu encontrassem:
AttributeError: 'dict' object has no attribute 'iteritems'
e pesquisassem em outro lugar (por exemplo, o erro “objeto dict 'não tem atributo' iteritems '” ao tentar usar o write_shp () do NetworkX por que isso está acontecendo.
def myfunc(**kwargs):
for k,v in kwargs.items():
print("%s = %s" % (k, v))
myfunc(abc=123, efh=456)
# abc = 123
# efh = 456
e:
def myfunc2(*args, **kwargs):
for a in args:
print(a)
for k,v in kwargs.items():
print("%s = %s" % (k, v))
myfunc2(1, 2, 3, banan=123)
# 1
# 2
# 3
# banan = 123
Adicionando aos outros excelentes posts.
Às vezes, você não deseja especificar o número de argumentos e deseja usar chaves para eles (o compilador reclamará se um argumento transmitido em um dicionário não for usado no método).
def manyArgs1(args):
print args.a, args.b #note args.c is not used here
def manyArgs2(args):
print args.c #note args.b and .c are not used here
class Args: pass
args = Args()
args.a = 1
args.b = 2
args.c = 3
manyArgs1(args) #outputs 1 2
manyArgs2(args) #outputs 3
Então você pode fazer coisas como
myfuns = [manyArgs1, manyArgs2]
for fun in myfuns:
fun(args)
def f(dic):
if 'a' in dic:
print dic['a'],
pass
else: print 'None',
if 'b' in dic:
print dic['b'],
pass
else: print 'None',
if 'c' in dic:
print dic['c'],
pass
else: print 'None',
print
pass
f({})
f({'a':20,
'c':30})
f({'a':20,
'c':30,
'b':'red'})
____________
o código acima será exibido
None None None
20 None 30
20 red 30
Isso é tão bom quanto passar argumentos variáveis por meio de um dicionário
f = lambda **dic: ' '.join(dic.get(key, 'None') for key in 'abc')
Outra maneira de fazer isso, além das respostas legais já mencionadas, depende do fato de que você pode passar argumentos nomeados opcionais por posição. Por exemplo,
def f(x,y=None):
print(x)
if y is not None:
print(y)
Rendimentos
In [11]: f(1,2)
1
2
In [12]: f(1)
1