<질문>
아무것도하지 않는 함수를 가리키고 싶습니다.
def identity(*args)
return args
내 사용 사례는 다음과 같습니다.
try:
gettext.find(...)
...
_ = gettext.gettext
else:
_ = identity
물론, 나는identity
위에서 정의했지만 내장 기능은 확실히 더 빨리 실행될 것입니다 (그리고 내 자신이 도입 한 버그를 피할 수 있습니다).
분명히,map
과filter
사용하다None
그러나 이것은 구현에 따라 다릅니다.
>>> _=None
>>> _("hello")
Traceback (most recent call last):
File "", line 1, in
TypeError: 'NoneType' object is not callable
<답변1>
더 많은 조사를했지만 아무것도 없었습니다.issue 1673203그리고Raymond Hettinger said there won't be:
사람들이 자신의 사소한 통과를 작성하고 서명 및 시간 비용에 대해 생각하게하는 것이 좋습니다.
따라서이를 수행하는 더 좋은 방법은 실제로입니다 (람다는 함수 이름 지정을 피합니다).
_ = lambda *args: args
- 장점 : 여러 매개 변수 사용
- 단점 : 결과는 매개 변수의 박스형 버전입니다.
또는
_ = lambda x: x
- 장점 : 매개 변수 유형을 변경하지 않음
- 단점 : 정확히 1 개의 위치 매개 변수를 사용합니다.
<답변2>
다음에 정의 된 식별 함수https://en.wikipedia.org/wiki/Identity_function, 단일 인수를 취하고 변경되지 않은 상태로 반환합니다.
def identity(x):
return x
서명을 원한다고 말할 때 요구하는 것def identity(*args)
이다아니여러 인수를 사용하려는 경우 엄격히 식별 함수입니다. 괜찮습니다.하지만 파이썬 함수가 여러 결과를 반환하지 않기 때문에 문제가 발생합니다. 따라서 모든 인수를 하나의 반환 값으로 압축하는 방법을 찾아야합니다.
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에 정의 된 ID 함수가 없습니다.
- 형식적인 정의 (단일 인수 함수)는 그다지 유용하지 않으며 작성하기가 쉽습니다.
- 정의를 여러 인수로 확장하는 것은 일반적으로 잘 정의되어 있지 않으며 특정 상황에 필요한 방식으로 작동하는 자체 버전을 정의하는 것이 훨씬 낫습니다.
정확한 케이스를 위해
def dummy_gettext(message):
return message
거의 확실하게 원하는 것입니다. 호출 규칙이 같고 다음과 같이 반환되는 함수입니다.gettext.gettext
, 인수를 변경하지 않고 반환하며, 수행하는 작업과 사용 대상을 설명하기 위해 명확하게 이름이 지정됩니다. 여기서 성능이 중요한 고려 사항이라면 꽤 충격적 일 것입니다.
<답변3>
당신은 잘 작동합니다. 매개 변수 수가 수정되면 다음과 같은 익명 함수를 사용할 수 있습니다.
lambda x: x
<답변4>
Python에는 내장 식별 기능이 없습니다. 의 모방Haskell's id
function다음과 같습니다.
identity = lambda x, *args: (x,) + args if args else x
사용 예 :
identity(1)
1
identity(1,2)
(1, 2)
이후identity
주어진 인수를 반환하는 것 외에는 아무것도하지 않습니다. 기본 구현보다 느리다고 생각하지 않습니다.
<답변5>
아니, 없습니다.
당신의identity
:
- 람다 * args : args와 동일합니다.
인수를 상자에 넣습니다. 즉
In [6]: id = lambda *args: args In [7]: id(3) Out[7]: (3,)
그래서, 당신은 사용할 수 있습니다lambda arg: arg
진정한 정체성 기능을 원한다면.
NB :이 예제는 내장 된id
함수 (아마도 사용하지 않을 것입니다).
<답변6>
속도가 중요하지 않은 경우 모든 경우를 처리해야합니다.
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)
<답변7>
gettext.gettext
(OP의 예제 사용 사례)는 단일 인수를 허용합니다.message
. 스텁이 필요하면 반환 할 이유가 없습니다.[message]
대신에message
(def identity(*args): return args
). 따라서 둘 다
_ = lambda message: message
def _(message):
return message
완벽하게 맞습니다.
...하지만 내장 기능은 확실히 더 빨리 실행될 것입니다 (그리고 내 자신이 도입 한 버그를 피할 수 있습니다).
이러한 사소한 경우의 버그는 거의 관련이 없습니다. 미리 정의 된 유형의 인수에 대해str
, 우리는 사용할 수 있습니다str()
그 자체를 신원 함수로서 (때문에string 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의 메모리 주소.
<답변8>
실은 꽤 오래되었습니다. 그러나 여전히 이것을 게시하고 싶었습니다.
인수와 객체 모두에 대한 식별 방법을 구축 할 수 있습니다. 아래 예에서 ObjOut은 ObjIn의 ID입니다. 위의 다른 모든 예제는 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}
'개발 > Python' 카테고리의 다른 글
파이썬 Django의 그룹에 사용자 추가 (0) | 2021.01.21 |
---|---|
한 줄의 Python 코드가 들여 쓰기 중첩 수준을 알 수 있습니까? (0) | 2021.01.21 |
Python에서 내 모듈을 가져올 수 없습니다. (0) | 2021.01.21 |
[파이썬] 기본이 아닌 인수가 기본 인수를 따를 수없는 이유는 무엇입니까? (0) | 2021.01.21 |