Eu gostaria de apontar para uma função que não faz nada:
def identity(*args)
return args
meu caso de uso é algo como isto
try:
gettext.find(...)
...
_ = gettext.gettext
else:
_ = identity
Obviamente, eu poderia usar o identity
definido acima, mas um built-in certamente funcionaria mais rápido (e evitaria bugs introduzidos por mim).
Aparentemente, map
e filter
use None
para a identidade, mas isso é específico para suas implementações.
>>> _=None
>>> _("hello")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not callable
map and filter use None for the identity
?map(None, [1, 2, 3])
Respostas:
Fazendo mais algumas pesquisas, não há, um recurso foi solicitado na edição 1673203 E de Raymond Hettinger disse que não haverá :
Portanto, a melhor maneira de fazer isso é (um lambda evita nomear a função):
OU
fonte
lambda x: x
função de identidade trivial que funciona para um parâmetro de string. @Marcin Eu gostaria de poder fazerlambda *args: *args
:-)Uma função de identidade, conforme definida em https://en.wikipedia.org/wiki/Identity_function , pega um único argumento e o retorna inalterado:
O que você está pedindo quando diz que deseja que a assinatura não
def identity(*args)
seja estritamente uma função de identidade, pois deseja que ela receba vários argumentos. Tudo bem, mas você encontra um problema, pois as funções Python não retornam vários resultados, portanto, é necessário encontrar uma maneira de agrupar todos esses argumentos em um único valor de retorno.A maneira usual de retornar "múltiplos valores" no Python é retornar uma tupla dos valores - tecnicamente esse é um valor de retorno, mas pode ser usado na maioria dos contextos como se fossem múltiplos valores. Mas fazer isso aqui significa que você obtém
E corrigir esse problema rapidamente fornece outros problemas, como as várias respostas aqui mostraram.
Portanto, em resumo, não há função de identidade definida no Python porque:
Para o seu caso preciso,
é quase certamente o que você deseja - uma função que tem a mesma convenção de chamada e retorno que
gettext.gettext
, que retorna seu argumento inalterado, e é claramente nomeada para descrever o que faz e onde deve ser usada. Eu ficaria muito chocado se o desempenho fosse uma consideração crucial aqui.fonte
id= lambda *args: args if len(args)>1 else args[0]
.o seu funcionará bem. Quando o número de parâmetros é corrigido, você pode usar uma função anônima como esta:
fonte
lambda *args: args
. É realmente uma escolha estilística.*args
versão possui um tipo de retorno diferente, portanto, eles não são equivalentes nem para o caso de argumento único.def
elambda
para funções tão simples.Não há uma função de identidade interna no Python. Uma imitação da função de Haskell
id
seria:Exemplo de uso:
Como
identity
não faz nada, exceto retornar os argumentos fornecidos, não acho que seja mais lento do que uma implementação nativa seria.fonte
Não, não existe.
Observe que seu
identity
:Colocará seus argumentos - ie
Portanto, você pode usar
lambda arg: arg
se desejar uma verdadeira função de identidade.Nota: Este exemplo irá ocultar a
id
função interna (que você provavelmente nunca usará).fonte
id
Se a velocidade não importa, isso deve lidar com todos os casos:
Exemplos de uso:
fonte
Esboço de uma função de argumento único
gettext.gettext
(o caso de uso de exemplo do OP) aceita um único argumentomessage
,. Se alguém precisar de um esboço, não há motivo para retornar em[message]
vez demessage
(def identity(*args): return args
). Assim, ambosse encaixam perfeitamente.
Erros em um caso tão trivial são pouco relevantes. Para um argumento de tipo predefinido, digamos
str
, podemos usar-str()
se como uma função de identidade (por causa da cadeia de caracteres interna, ela ainda mantém a identidade do objeto, veja aid
nota abaixo) e comparar seu desempenho com a solução lambda:Uma micro-otimização é possível. Por exemplo, o seguinte código Cython :
test.pyx
Então:
Função de identidade de objeto incorporada
Não confunda uma função de identidade com a
id
função interna que retorna a 'identidade' de um objeto (ou seja, um identificador exclusivo para esse objeto em particular, e não o valor desse objeto, em comparação com o==
operador), seu endereço de memória no CPython.fonte
O tópico é bem antigo. Mas ainda queria postar isso.
É possível criar um método de identidade para argumentos e objetos. No exemplo abaixo, ObjOut é uma identidade para ObjIn. Todos os outros exemplos acima não lidaram com dict ** kwargs.
fonte
map(identity, [1, 2, 3])
retorna[1, 2, 3]
?class test1(object): def __init__(self,*args,**kwargs): self.args = args self.kwargs = kwargs def identity (self): return self.args print(test1([1,2,3]).identity())
-> Resultado: ([1, 2, 3],)