Python Import로 골프하기


16

파이썬에서 인라인, 단일 사용 가져 오기를 사용하는 것이 언제 유익합니까?

예를 들면 다음과 같습니다.

__import__("x").doSomething()

위가 아래보다 짧습니까?

import x
x.doSomething()

또는

from x import*
doSomething()

답변:


11

익명 람다 함수에서 모듈을 한 번만 사용하려는 경우 별도의 명령문을 작성하지 않아도되므로 유용합니다.

lambda x:__import__('SomeModule').foo(x,123)

1 바이트보다 짧다

from SomeModule import*;f=lambda x:foo(x,123)

코드가 명명 된 함수 또는 프로그램 __import__인 경우, 가장 극단적이거나 고려 된 상황을 제외하고는 도움이되지 않습니다.


__import__들여 쓰기 된 블록 안에 있기 때문에 명명 된 함수 내부에 도움이됩니다. 수입은 두 줄로되어 있고 들여 쓰기 때문에 추가 비용이 듭니다. (이것은 수입품이 기능 밖에서 허용되지 않는다고 가정합니다.)
Alex A.

@AlexA 명명 된 함수 외부에 가져 오기를 배치하는 데 아무런 문제가 없습니다.
feersum

그렇다면 import들여 쓰기 된 블록 안에서 호출 될 시간 이 있습니까? 아마 아닙니다.
Alex A.

명명 된 함수 외부로 가져 오기를 수행하면 하나의 함수 만 작성하는 문제에서는 작동하지 않습니다.
Sparr

6
두 번째 예는 익명 함수가 허용 되고 함수 외부에 컨텐츠를 가질 수f= 있기 때문에 필요하지 않습니다 .
xnor

4

이름이 충분히 긴 여러 모듈을 가져올 때 __import__함수를 더 짧은 변수 에 할당하고 가져 오기에 사용하면 도움이 될 수 있습니다

예:

일반 가져 오기 문-97 바이트

itertools에서 가져 오기 *
날짜 / 시간에서 가져 오기 *
인쇄 목록 (순열 ( "abc"))
datetime.now () 인쇄

할당 __import__i- 94 바이트 :

i = __ import__
인쇄 목록 (i ( "itertools"). permutations ( "abc"))
인쇄 i ( "datetime"). datetime.now ()

1

거의 없다.

__import__("x").doSomething()길이 x 의 이름을 가진 모듈을 나타내려면 15+ x 문자가 필요합니다 .

import x\nx.doSomething()9 + 2 * x 문자 가 필요 합니다. 이러한 함수는 x = 6 에서 겹치므로이 방법과 비교하여 이름이 긴 모듈을 사용하는 것이 더 좋습니다 __import__.

그러나 from x import*\ndoSomething()14+ x 문자 만 필요 하므로 일반 가져 오기와 비교할 때 모듈 이름이 5자를 초과하지 않는 한 가치가 없습니다.

이것은 모두 함수 / 클래스 / 무엇을 한 번만 참조한다고 가정합니다. 두 번 이상 참조하면 수식이 변경되고 후자 버전이 승자가 될 수 있습니다. 가져온 모듈에서 오랫동안 무언가를 사용하면 다른 버전이 승리합니다.

from x import y as z그물하면 18 + X + Y +에서 의 Z * ( N + 1) 문자의 N 의 사용 Z 경우 큰 개선, Y가 크기 때문에, Z는 1로 할 수있다.


1
수학을 확인할 수 있습니까? __import__("x").doSomething()보다 짧은 하나의 문자를 찾습니다 from x import*;doSomething(). 아마도 당신은 줄 바꿈을 두 문자로 간주합니까? 그리고 손익분기 점, 5 인 사이에 떨어지는 불러 timerandom.
xnor

@ xnor 나는 개행을 두 번 세지 않았지만 그 버전에서 점이 필요 없다는 것을 놓쳤다. 잠시만 기다려주세요. 업데이트하겠습니다.
L3viathan

1
z=__import__("x").y바이트보다 짧습니다from x import y as z
음수 7

1
@negativeseven 짧게 : from x import*;z=y.
L3via6
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.