2016-12-06 33 views
5

은 우리가 다음 예를 보자 :바이트를 함수에 대한 키워드 인수의 키로 어떻게 전달할 수 있습니까?

def fun(**args): 
    print(str(args)) 

dic = {'name': 'Pulkit'} 
fun(**dic) 

이 코드는 잘 작동하고 나는 다음과 같은 출력이 있습니다

dic_vb = {'name': b'Pulkit'} 
fun(**dic_vb) 

이 :

{'name': 'Pulkit'} 

지금 바이트로 값을 건네 줄 수가 있습니다을 또한 잘 작동하고 다음과 같은 결과가 출력됩니다.

,210

하지만 바이트로 키가하려고 할 때 상황이 변경 :

dic_kb = {b'name': 'Pulkit'} 

이 결과 형식 오류의 말 :

TypeError: fun() keywords must be strings 

을 우리가 키워드 인수로 바이트를 전달할 수있는 방법이 있습니까. 또한 키워드 인수를 다루는 CPython 코드 repo을 확인하고 통과 할 수없는 것처럼 보입니다. 해결 방법이 있습니까? 아니면 유니 코드가 전달되는지 확인해야합니까?

저는 파이썬 2에서 그러한 인스턴스가 많이 있고 파이썬 3에 포팅해야하는 코드베이스를 다루고 있습니다. 따라서 모든 키워드 인수를 유니 코드로 변환하는 것이 가능합니까?

답변

4

, 그것은 기능 키 **kwargs 예상대로 번호가 사전을 제공 할 수없는 이유 같은 이유 아니, 키워드 식별자 유효 할 필요가있다 :

>>> dic = {1: 'Pulkit'} 
>>> fun(**dic) 
TypeErrorTraceback (most recent call last) 
<ipython-input-54-83c29ed0f08e> in <module>() 
     3 
     4 dic = {1: 'Pulkit'} 
----> 5 fun(**dic) 

TypeError: fun() keywords must be strings 

또한 당신이보고 무슨 일이 출처는 부정 행위 (!)가 PyUnicode_Check이며 시행자로 사용됩니다.

필수 항목입니다. 이름으로 작동 할 수있는 키를 제공해야합니다. 허용되지 않는 것입니다 무엇을 확인하려면, 단지 대화 형 인터프리터에 이름에 할당 시도하고 잘못한다 무엇을 참조하십시오

>>> b'my_list' = [...] # err 
>>> 23 = [21, 22]  # err 

실행 가능한 (그리고 유일한이, decode이 허가되어 있지 않은 경우) 옵션은 사전 통과 그냥 다른 인수로 누른 다음 일반적인 사전 조회를 통해 값을 액세스 할 수 있습니다.

>>> dic = {b'name': 'Pulkit'} 
>>> fun(**{b.decode(): v for b, v in dic.items()}) 
: 물론

함수를 호출 전에 문자열 에 바이트를 디코딩하는 실행 가능한 대안 경우에, 나는 당신이 그 옵션을 추구 제안