Pergunta

Eu tenho uma função Python em que eu estou fazendo algum sanitização dos parâmetros de entrada:

def func(param1, param2, param3):
    param1 = param1 or ''
    param2 = param2 or ''
    param3 = param3 or ''

Isso contribuiu para fazer os argumentos a ser passado como Nenhum em vez de strings vazias. Existe uma mais concisa maneira mais fácil / para repetir rodada os parâmetros da função de aplicar tal expressão para todos eles. Minha função real tem nove parâmetros.

Foi útil?

Solução

Este parece como um trabalho bom para um decorador. Como sobre isto:

def sanitized(func):
    def sfunc(*args, **kwds):
        return func(*[arg or '' for arg in args],
                    **dict((k, v or '') for k,v in kwds.iteritems()))
    sfunc.func_name = func.func_name
    sfunc.func_doc = func.func_doc
    return sfunc

Você poderia usar isso em sua função assim:

@sanitized
def func(param1, param2, param3):
    print param1, param2, param3

Em seguida, os parâmetros serão substituídos por uma string vazia se eles são falsos:

>>> func('foo', None, 'spam')
foo  spam

(Note que isto irá ainda atrapalhar a assinatura função que aponta Ned Batchelder em sua resposta. Para corrigir isso você poderia usar Michele Simionato decorador módulo - Eu acho que você só precisa adicionar um @decorator antes da definição de sanitized)

Outras dicas

Você poderia fazer alguma lista manipulação:

def func(param1, param2, param3):
    param1, param2, param3 = map(lambda x: x or '', (param1, param2, param3))

mas não estou certo de que é melhor do que simplesmente escrever as nove linhas, uma vez que uma vez que você chegar a nove parâmetros, que é uma linha horrenda longo.

Você pode alterar a declaração da função:

def func(*args):
    param1, param2, param3 = map(lambda x: x or '', args)

mas então você perde a documentação que vem de ter nomes de parâmetros reais, bem como a possibilidade de mudar os padrões, etc. E você ainda tem uma bonita fugly linha lá para descompactá-los.

Eu digo escrever as nove linhas, ou alterar a função de ter menos parâmetros: nove é uma espécie de um monte de qualquer maneira

!
def func(x='', y='', z='hooray!'):
    print x, y, z

In [2]: f('test')
test  hooray!

In [3]: f('test', 'and')
test and hooray!

In [4]: f('test', 'and', 'done!')
test and done!
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top