[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



답변

좀 더 연구를하고, 아무도, 기능이 거기 요구하지 않았다되는 문제 1673203 그리고에서 레이몬드 Hettinger는 없을 것이라고 말했다 :

사람들이 자신의 사소한 패스 스루를 작성하고 서명 및 시간 비용에 대해 생각하게하는 것이 좋습니다.

그래서 그것을하는 더 좋은 방법은 실제로 (람다는 함수의 이름을 피하는 것입니다) :

_ = lambda *args: args
  • 장점 : 여러 매개 변수를 사용합니다
  • 단점 : 결과는 박스 버전의 매개 변수입니다.

또는

_ = lambda x: x
  • 장점 : 매개 변수의 유형을 변경하지 않습니다
  • 단점 : 정확히 1 개의 위치 매개 변수 사용

답변

https://en.wikipedia.org/wiki/Identity_function에 정의 된대로 identity 함수 는 단일 인수를 사용하여 변경되지 않은 상태로 반환합니다.

def identity(x):
    return x

서명을 원할 때 요구하는 def identity(*args)것은 여러 인수를 취하기를 원하기 때문에 엄격하게 ID 함수 가 아닙니다 . 괜찮습니다.하지만 파이썬 함수는 여러 결과를 반환하지 않으므로 문제가 발생하므로 모든 인수를 하나의 반환 값으로 구성하는 방법을 찾아야합니다.

파이썬에서 “다중 값”을 반환하는 일반적인 방법은 기술적으로 하나의 반환 값이지만 여러 값인 것처럼 대부분의 컨텍스트에서 사용할 수있는 값의 튜플을 반환하는 것입니다. 하지만 여기서하는 것은

>>> 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,)

그리고 고정 여기에 다양한 대답이 표시대로 신속하게 문제 것은 다른 문제를 제공합니다.

따라서 요약하면 파이썬에는 다음과 같은 이유로 식별 함수가 정의되어 있지 않습니다.

  1. 공식적인 정의 (단일 인수 함수)는 그다지 유용하지 않으며 작성하기가 쉽지 않습니다.
  2. 정의를 여러 인수로 확장하는 것은 일반적으로 잘 정의되어 있지 않으므로 특정 상황에 필요한 방식으로 작동하는 고유 버전을 정의하는 것이 훨씬 좋습니다.

정확한 경우를 위해

def dummy_gettext(message):
    return message

거의 확실하게 원하는 것입니다-호출 규칙이 같고 as gettext.gettext를 반환하는 함수는 인수를 변경하지 않고 반환하며 함수의 역할과 용도를 명확하게 지정합니다. 성능이 중요한 고려 사항이라면 충격을받을 것입니다.


답변

당신은 잘 작동합니다. 매개 변수 수가 수정되면 다음과 같은 익명 함수를 사용할 수 있습니다.

lambda x: x


답변

파이썬에는 내장 된 아이덴티티 함수가 없습니다. 하스켈 id기능 의 모방은 다음과 같습니다.

identity = lambda x, *args: (x,) + args if args else x

사용법 예 :

identity(1)
1
identity(1,2)
(1, 2)

identity주어진 인수를 반환하는 것 외에는 아무것도하지 않기 때문에 네이티브 구현보다 느리다고 생각하지 않습니다.


답변

아닙니다.

당신의 identity:

  1. lambda * args : args와 같습니다.
  2. 그것의 인수를 윌 박스-즉

    In [6]: id = lambda *args: args
    
    In [7]: id(3)
    Out[7]: (3,)

따라서 lambda arg: arg진정한 아이덴티티 기능을 원한다면 사용할 수 있습니다.

주의 :이 예제는 내장 id함수를 사용하지 않을 것입니다 (아마도 사용하지 않을 것입니다).


답변

속도가 중요하지 않은 경우 모든 경우를 처리해야합니다.

def identity(*args, **kwargs):
    if not args:
        if not kwargs:
            return None
        elif len(kwargs) == 1:
            return  next(iter(kwargs.values()))
        else:
            return (*kwargs.values(),)
    elif not kwargs:
        if len(args) == 1:
            return args[0]
        else:
            return args
    else:
        return (*args, *kwargs.values())

사용 예 :

print(identity())
None
$identity(1)
1
$ identity(1, 2)
(1, 2)
$ identity(1, b=2)
(1, 2)
$ identity(a=1, b=2)
(1, 2)
$ identity(1, 2, c=3)
(1, 2, 3)


답변

단일 인수 함수의 스텁

gettext.gettext(OP의 예제 사용 사례)는 단일 인수 인을 허용합니다 message. 스텁이 필요한 경우 ( ) [message]대신 반환 할 이유가 없습니다 . 따라서 둘 다messagedef identity(*args): return args

_ = lambda message: message

def _(message):
    return message

완벽하게 맞습니다.

…하지만 내장 기능은 확실히 더 빨라질 것입니다.

그러한 사소한 경우의 버그는 거의 관련이 없습니다. 사전 정의 된 유형의 인수 인 경우 str, 우리는 str()자신을 ID 함수로 사용할 수 있습니다 ( 문자열 interning 때문에 객체 ID를 유지 하기 때문에 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 코드 는 다음과 같습니다 .

test.pyx

cpdef str f(str message):
    return message

그때:

$ pip install runcython3
$ makecython3 test.pyx
$ python3 -m timeit -s "from test import f" "f('foo')"
10000000 loops, best of 3: 0.0317 usec per loop

내장 객체 식별 기능

와 식별 기능을 혼동하지 마십시오 id내장 반환 함수 객체의 ‘정체성’ (에 비해, 특정 객체가 아니라 객체의 값에 대한 고유 식별자를 의미를 ==CPython의 연산자), 메모리 주소입니다.