Есть ли встроенная функция идентификации в 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
569   7  

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 нет функции идентификации потому что:

  1. формальное определение (функция с одним аргументом) не так полезно и тривиально для записи.
  2. расширение определения до нескольких аргументов не является четко определенным в целом, и вам гораздо лучше определить свою собственную версию, которая работает так, как вам нужно для вашей конкретной ситуации.

для точного дела,

def dummy_gettext(message):
    return message

- это почти наверняка то, что вы хотите - это функция, которая имеет тот же призыв конвенция и возвращение как gettext.gettext, который возвращает свой аргумент без изменений и четко назван для описания того, что он делает и где он предназначен для использования. Я был бы очень шокирован, если бы производительность была решающим фактором здесь.

нет, нет.

обратите внимание, что ваш identity:

  1. эквивалентно лямбда * args: args
  2. будет боксировать его 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

    Ничего не найдено.