2016-12-06 18 views
5

は、私たちは、次の例を持ってみましょう:関数にキーワード引数のキーとしてバイトを渡すにはどうすればよいですか?

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

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

このコードは正常に動作し、私は次の出力を持っている:

{'name': 'Pulkit'} 

は今バイトとして値を渡すことができます:

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

このまた、正常に動作し、次の出力を持っています:

{'name': b'Pulkit'} 

しかし、私はバイトとして鍵を持ってしようとすると、物事は変わる:

TypeError: fun() keywords must be strings 

たちはキーワード引数としてバイトを渡すことができますどのような方法があります:

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

これは言ってはTypeErrorになります。私もキーワード引数を扱うrepoのCPythonコードを調べましたが、私たちが渡すことはできないようです。回避策がありますか、またはユニコードが渡されていることを確認する必要がありますか?

私はPython 2でこのようなインスタンスがたくさんあるので、Python 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が執行者の役割を果たしています。

必須です。名前の役割を果たすキーを提供する必要があります。 、ちょうど対話インタプリタで名前に代入しようとしてERRSかを見るものですし、何を許可されていませんを参照するには、次の

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

decodeが許可されていない場合、そして唯一の)実行可能なオプションは、辞書を渡しています通常の辞書ルックアップを使って値にアクセスすることである。

>>> dic = {b'name': 'Pulkit'} 
>>> fun(**{b.decode(): v for b, v in dic.items()}) 
:もちろん

機能を呼び出す前に、文字列バイトをデコードすることは実行可能な代替であれば、私はあなたがそのオプションを追求することをお勧め

関連する問題