Я хотел бы указать на функцию, которая ничего не делает:
def identity(*args)
return args
мой случай использования что-то вроде этого
try:
gettext.find(...)
...
_ = gettext.gettext
else:
_ = identity
Конечно, я мог бы использовать identity
вышеописанное, но встроенный мог бы работать быстрее (и избежать ошибок, связанных с моими).
Видимо, map
и filter
используют None
для идентификации, но это специфично для их реализации.
>>> _=None
>>> _("hello")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not callable
python
python-3.x
python-2.7
выстр
источник
источник
map and filter use None for the identity
?map(None, [1, 2, 3])
Ответы:
Если провести еще какое-то исследование, то ничего не было, вопрос был задан в выпуске 1673203, а Рэймонд Хеттингер сказал, что не будет :
Таким образом, лучший способ сделать это на самом деле (лямбда-код избегает именования функции):
ИЛИ
источник
lambda x: x
функция идентичности, которая работает для одного строкового параметра. @Marcin Я хотел бы сделатьlambda *args: *args
:-)Функция идентификации, как определено в https://en.wikipedia.org/wiki/Identity_function , принимает один аргумент и возвращает его без изменений:
То, о чем вы просите, когда говорите, что хотите подпись
def identity(*args)
, не является строго идентичной функцией, поскольку вы хотите, чтобы она принимала несколько аргументов. Это нормально, но затем вы сталкиваетесь с проблемой, поскольку функции Python не возвращают несколько результатов, поэтому вы должны найти способ объединить все эти аргументы в одно возвращаемое значение.Обычный способ возврата «множественных значений» в Python - это возврат кортежа значений - технически это одно возвращаемое значение, но его можно использовать в большинстве контекстов, как если бы это были множественные значения. Но, делая это здесь, вы получаете
И решение этой проблемы быстро дает другие проблемы, как показали различные ответы здесь.
Итак, в итоге, в Python не определена функция идентификации, потому что:
Для вашего точного случая,
почти наверняка то, что вы хотите - функция, которая имеет то же соглашение о вызовах и return
gettext.gettext
, что и возвращает свой аргумент без изменений и имеет четкие имена для описания того, что она делает и где она предназначена для использования. Я был бы очень шокирован, если бы производительность была решающим фактором здесь.источник
id= lambda *args: args if len(args)>1 else args[0]
.у тебя будет нормально работать. Когда число параметров фиксировано, вы можете использовать анонимную функцию, например:
источник
lambda *args: args
. Это действительно стилистический выбор.*args
версия имеет другой тип возвращаемого значения, поэтому они не эквивалентны даже для случая с одним аргументом.def
иlambda
для таких простых функций.В Python нет встроенной функции идентификации. Имитация Хаскеля
id
функции будет выглядеть так :Пример использования:
Поскольку
identity
ничего не делает, кроме возврата заданных аргументов, я не думаю, что это медленнее, чем была бы нативная реализация.источник
Нет, нет
Обратите внимание, что ваш
identity
:Буду боксировать свои арги - т.е.
Итак, вы можете использовать,
lambda arg: arg
если вы хотите истинную функцию идентичности.NB. Этот пример будет скрывать встроенную
id
функцию (которую вы, вероятно, никогда не будете использовать).источник
id
Если скорость не имеет значения, это должно обрабатывать все случаи:
Примеры использования:
источник
Заглушка функции с одним аргументом
gettext.gettext
(пример использования OP) принимает один аргументmessage
. Если для этого нужна заглушка, нет смысла возвращаться[message]
вместоmessage
(def identity(*args): return args
). Таким образом, обаподходит идеально.
Ошибки в таком тривиальном случае едва ли актуальны. Например, для аргумента предопределенного типа
str
мы можем использоватьstr()
себя в качестве функции тождественности (из-за интернирования строк он даже сохраняет тождество объекта, см.id
Примечание ниже) и сравнивать его производительность с лямбда-решением:Возможна микрооптимизация. Например, следующий код Cython :
test.pyx
Затем:
Встроенная функция идентификации объекта
Не путайте функцию тождественности со
id
встроенной функцией, которая возвращает «тождество» объекта (то есть уникальный идентификатор для этого конкретного объекта, а не значение этого объекта по сравнению с==
оператором), его адрес памяти в CPython.источник
Нить довольно старая. Но все же хотел опубликовать это.
Можно создать метод идентификации для аргументов и объектов. В приведенном ниже примере ObjOut является идентификатором ObjIn. Все остальные примеры выше не имели отношения к dict ** kwargs.
источник
map(identity, [1, 2, 3])
возвращается[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())
-> Результат: ([1, 2, 3],)