2013-04-11 3 views

답변

1

루프가 func() 이상의 결과를 얻었습니까? 파이썬 3를 사용하는 경우

one, three = [v for k, v in sorted(func().iteritems()) if k in {'one', 'three'}] 

.items().iteritems()를 교체

데모 :이 방법은 오히려 이상한, 정렬 키 위해 대상 목록을 유지하도록 요구

>>> def func(): 
...  return dict(one=1, two=2, three=3) 
... 
>>> one, three = [v for k,v in sorted(func().iteritems()) if k in {'one', 'three'}] 
>>> one, three 
(1, 3) 

하는 것으로 단순하고 간단해야하는 것에 대한 제한

이것은 입니다. 자세한 내용은 버전 번호입니다. 정말로 잘못된 것은 없습니다.

+0

이것이 실패하면 데모 결과를보십시오 - func() [ 'one']! = 3 – ch3ka

+0

@ ch3ka : fixed; 그것은 필요한 것이 었습니다. –

+0

여전히 일반적인 경우에는 실패합니다. – ch3ka

2

중간 변수에 어떤 문제가 있습니까?

>>> (one,three) = (lambda d:(d['one'],d['three']))(func()) 

(정말 즉석에서 생성되는 기능으로 중간 값을 이동 이외의 아무것도하지 않는다)

: 솔직히, 그게 내가 그것을 제거하도록 요리 추한 것보다 더 WAY 낫다
+0

동의; 내 것과 당신 모두는 필요한 것보다 더 추악합니다. –

+0

감사합니다. 내가 선호하는 방법을 요구하지는 않았지만 가능한 대안에 대해서만 유의하십시오. 그래야만 스타일 선택을 할 수 있습니다. 그리고 지금까지, 중간 변수가 3 가지 대안보다 더 명확하다는 데 동의합니다. 그리고 지금까지 3 가지 대안 중에서, 나는 당신을 가장 좋아합니다. –

1

대부분의 경우 중간 딕 트는 문제가되지 않습니다. 가독성을 계산합니다. 정말이 상황에서 너무 자주 자신을 찾을 경우에, 당신은 당신의 기능 monkeypatch하기 위해 장식을 사용할 수 같은

In  : from functools import wraps 

In  : def dictgetter(func, *keys): 
    .....:  @wraps(func) 
    .....:  def wrapper(*args, **kwargs): 
    .....:   tmp = func(*args, **kwargs) 
    .....:   return [tmp[key] for key in keys] 
    .....:  return wrapper 

In  : def func(): 
    ....:   return dict(one=1, two=2, three=3) 
    ....: 

In  : func2 = dictgetter(func, 'one', 'three') 

In  : one, three = func2() 

In  : one 
Out : 1 

In  : three 
Out : 3 

또는 무언가를.

물론, 호출 시간에 원하는 필드를 지정할 수 있도록 monkeypatch 할 수도 있지만,이 메커니즘을 감싸는 일반 함수를 원할 것입니다.

이 위 데프 래퍼의 몸에 매우 유사 구현과 같은

one, three = getfromdict(func(), 'one', 'three') 

또는 무언가 같이 사용,하지만 당신은 위의 모든 장식을 다시 사용할 수있는 것 :

In  : two, three = dictgetter(func, 'two', 'three')() 

In  : two, three 
Out : (2, 3) 
관련 문제