2011-10-07 8 views
5

파이썬 사전으로 구문 분석하는 JSON 라이브러리를 사용하여 JSON 요청을 구문 분석하고 있습니다. 요청은 사용자가 생성하므로 제공되지 않은 매개 변수에 대한 기본값을 수정해야합니다. 다른 언어에는 반복적 인 애플리케이션에 적합한 3 진 연산자와 같은 것이 있습니다. 그러나 아래 코드는 매개 변수 당 4 줄이 필요합니다.사전에서 파이썬으로 기본값을 수정하는 방법?

if "search_term" in request.keys(): 
    search_term=request['search_term'] 
else: 
    search_term="" 
if "start" in request.keys(): 
    start=request['start'] 
else: 
    start=0 
if "rows" in request.keys(): 
    rows=request['rows'] 
else: 
    rows=1000000 

코드 줄을 줄이거 나 가독성있게 만드는 Pythonic 방법이 있습니까?


편집 다음 (위) 모두 대답은 똑같이 유용합니다. 이것은 당신이 당신이 아마하고 싶은 클래스의 속성이나 모듈 전역 변수로 defaults을 유지할 수 있습니다

defaults = dict(a=1, b=2, c=3) 

result = dict(defaults) # Copy the defaults 
result.update(request) # Update with your values 

: 나는

+0

라인 : ** request.keys()의 "행"경우 : **는 당신이 isinstance(result, dict)가하는 오만한 코드를 처리해야하는 경우도 있습니다 더 간단하게 : ** "rows"in request : **. – MrWonderful

답변

15

이 기본값의 사본에 dict.update 방법을 사용하여 서로 다른 상황에서 모두를 사용했다.

또한으로 마지막 두 줄을 결합 할 수 있습니다 : 다른 솔루션의

result = dict(defaults, **request) 

, Kevin's answer를 참조하십시오.

+0

나는 dict.get()에 대한 대안으로 이것을 좋아한다. 왜냐하면 모든 기본값을 한 줄로 지정할 수 있기 때문이다. 이것은 기본값이 미래에 변경 될 가능성이있는 경우 유용 할 수 있습니다. 그런 다음 선언 된 위치를 찾기 위해 많은 'if'문을 사냥 할 필요가 없습니다. – Kevin

+0

+1 - 기본값을 관리하고 유지 관리가 용이 ​​한 중앙 위치를 제공합니다. 좋은 대답입니다! –

+2

+1. 이것은 훌륭한 솔루션입니다. 나는이 메소드가'defaults'의 복사본과 함께 사용되어야한다고 강조해야합니다. 그렇지 않으면'defaults'가 수정됩니다. 또한 논리를 뒤집을 수 없습니다. 'request.update (defaults)'를하면 요청을 기본값으로 덮어 씁니다. –

12

사전 메서드 get을 사용할 수 있습니다. 사전 메서드 get은 사전에 값이없는 경우 반환 할 기본값 인 두 번째 인수입니다.

start = request.get('start', 0) 
+0

+1이 방법은 읽기 쉽고 이해하기 쉽습니다. 나는 기본값이 너무 많은 값이 없을 때 선호한다. –

+1

나는 두 개의 대답을 받아 들일 수 있기를 바란다 :-( – aitchnyu

2

파이썬 사전을 기본 매개 변수를 취하는 get() 기능이 (당신은 here 것을 확인할 수 있습니다). 그래서 당신은 다음과 같이 할 수 있습니다 :

등등.

EDIT :: 위의 Petr에서 나온 update 솔루션으로 가고 싶을 것입니다. 파이썬 3.3 이상을 사용할 수있을만큼 운이 좋다면

2

, 당신은 collections.ChainMap를 사용할 수 있습니다

from collections import ChainMap 

defaults = {'color': 'red', 'taste': 'sweet'} 
request = {'taste': 'sour', 'size': 'small'} 

result = ChainMap(request, defaults) 

print(result['taste']) # sour -- overridden 
print(result['color']) # red -- from default 
print(result['size']) # small -- new value 

이 모두 defaultsrequest dicts 복사의 ChainMap에없는 "연결"되어 있습니다. 그들에게 모든 변경 사항은 result에 반영됩니다

defaults['color'] = 'green' 
print(result['color']) # green 

del result['taste'] 
print(result['taste']) # sweet 

이를 방지하기 위해, 당신은 당신이 그것을 구축 할 때 DICT하는 ChainMap을 변환 할 수 있습니다. 다른 사람이 아직이 점을 지적하지 않았기 때문에

print(dict(result)) 
# {'color': 'green', 'taste': 'sweet', 'size': 'small'} 
+0

Nice. http://code.activestate.com/recipes/305268/에서 ChainMap의 사용 가능한 2.x 구현 (약간 다른 철자)이있다. 3.x docs하지만 나는 여기에 가야한다고 생각했다.) – torek

+0

@torek True.이 특별한 경우에 귀찮은 일은 없을 것이다. –