Есть ли встроенная функция идентификации в python?
Я хотел бы указать на функцию, которая ничего не делает:
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
7 ответов:
делая еще несколько исследований, нет ни одного, функция была задана в выпуск 1673203 и компания Raymond Hettinger сказал, что не будет:
лучше пусть люди пишут свои собственные тривиальные облигаций и подумайте о подписи и временных затратах.
Так что лучший способ сделать это на самом деле (лямбда избегает называть функцию):
_ = lambda *args: args
- преимущество: принимает любое количество параметры
- недостаток: результатом является коробочная версия параметров
или
_ = lambda x: x
- преимущество: не изменяет тип параметра
- недостаток: занимает ровно 1 позиционный параметр
Ваш будет работать нормально. Когда количество параметров исправлено, вы можете использовать анонимную функцию следующим образом:
lambda x: x
функция идентификации, как определено в https://en.wikipedia.org/wiki/Identity_function, принимает один аргумент и возвращает его без изменений:
def identity(x): return xто, что вы просите, когда вы говорите, что вы хотите подпись
def identity(*args)- это не строго функция идентификации, так как вы хотите, чтобы она принимала несколько аргументов. Это нормально, но тогда вы сталкиваетесь с проблемой, поскольку функции Python не возвращают несколько результатов, поэтому вам нужно найти способ забить все это аргументы в одно возвращаемое значение.обычным способом возврата "нескольких значений" в Python является возврат кортежа значений - технически это одно возвращаемое значение, но его можно использовать в большинстве контекстов, как если бы это было несколько значений. Но делать это здесь означает, что вы получите
>>> def mv_identity(*args): ... return args ... >>> mv_identity(1,2,3) (1, 2, 3) >>> # So far, so good. But what happens now with single arguments? >>> mv_identity(1) (1,)и ремонт это проблема быстро дает другие вопросы, как показали различные ответы здесь.
Итак, в общем, в Python нет функции идентификации потому что:
- формальное определение (функция с одним аргументом) не так полезно и тривиально для записи.
- расширение определения до нескольких аргументов не является четко определенным в целом, и вам гораздо лучше определить свою собственную версию, которая работает так, как вам нужно для вашей конкретной ситуации.
для точного дела,
def dummy_gettext(message): return message- это почти наверняка то, что вы хотите - это функция, которая имеет тот же призыв конвенция и возвращение как
gettext.gettext, который возвращает свой аргумент без изменений и четко назван для описания того, что он делает и где он предназначен для использования. Я был бы очень шокирован, если бы производительность была решающим фактором здесь.
нет, нет.
обратите внимание, что ваш
identity:
- эквивалентно лямбда * args: args
будет боксировать его args-т. е.
In [6]: id = lambda *args: args In [7]: id(3) Out[7]: (3,)Итак, вы можете использовать
lambda arg: argЕсли вы хотите истинную функцию идентичности.
в Python нет встроенной функции идентификации. Имитация Хаскелл
idфункции будет:identity = lambda x, *args: (x,) + args if args else xпример использования:
identity(1) 1 identity(1,2) (1, 2)С
identityничего не делает, кроме возврата заданных аргументов, я не думаю, что это медленнее, чем собственная реализация. Это может быть даже быстрее, потому что он сохраняет вызов собственной функции.
заглушка функции с одним аргументом
gettext.gettext(пример использования OP) принимает один аргумент,message. Если для этого нужен заглушка, нет причин возвращаться[message]вместоmessage(def identity(*args): return args). Таким образом, оба_ = lambda message: message def _(message): return messageидеально подходят.
...но встроенный, безусловно, будет работать быстрее (и избегать ошибок, введенных моими собственными).
ошибки в таком тривиальном случае едва соответствующий. Для аргумента предопределенного типа, скажем
str, мы можем использоватьstr()сам как функция идентификации (из-за интернировании строк он даже сохраняет идентичность объекта, см.idПримечание ниже) и сравнить его производительность с решением лямбда:$ python3 -m timeit -s "f = lambda m: m" "f('foo')" 10000000 loops, best of 3: 0.0852 usec per loop $ python3 -m timeit "str('foo')" 10000000 loops, best of 3: 0.107 usec per loopвозможна микрооптимизация. Например, следующее на Cython код:
нить довольно старая. Но все равно хотел опубликовать это.
можно построить метод идентификации как для аргументов, так и для объектов. В приведенном ниже примере ObjOut является идентификатором для ObjIn. Все другие примеры выше не касались dict * * kwargs.
class test(object): def __init__(self,*args,**kwargs): self.args = args self.kwargs = kwargs def identity (self): return self objIn=test('arg-1','arg-2','arg-3','arg-n',key1=1,key2=2,key3=3,keyn='n') objOut=objIn.identity() print('args=',objOut.args,'kwargs=',objOut.kwargs) #If you want just the arguments to be printed... print(test('arg-1','arg-2','arg-3','arg-n',key1=1,key2=2,key3=3,keyn='n').identity().args) print(test('arg-1','arg-2','arg-3','arg-n',key1=1,key2=2,key3=3,keyn='n').identity().kwargs) $ py test.py args= ('arg-1', 'arg-2', 'arg-3', 'arg-n') kwargs= {'key1': 1, 'keyn': 'n', 'key2': 2, 'key3': 3} ('arg-1', 'arg-2', 'arg-3', 'arg-n') {'key1': 1, 'keyn': 'n', 'key2': 2, 'key3': 3}
Comments