Python: 関数の引数リストのdict, tuple

dist 引数。

>>> def func(**keys):
…     print keys

>>> func(i=2,j=3)
{’i’: 2, ‘j’: 3}
>>> func(i=2,j=3,k=4)
{’i’: 2, ‘k’: 4, ‘j’: 3}

 

デフォルト引数リストに**dictを渡すことができる

>>> a={’i’: 2, ‘j’:3, ‘k’:4}
>>> func(a)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeError: func() takes exactly 0 arguments (1 given)
>>> func(**a)
{’i’: 2, ‘k’: 4, ‘j’: 3}

 

デフォルト引数に**dictを渡す時には存在しないキーがわたるとエラー。

>>> def func(i=0,j=0):
…    print i, j

>>> func(1,2)
1 2
>>> a={’j’:3,’i’:2}
>>> func(a)
{’i’: 2, ‘j’: 3} 0
>>> func(**a)
2 3
>>> b={’k’:4,’j’:3,’i’:2}
>>> func(**b)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeError: func() got an unexpected keyword argument ‘k’

 

デフォルト引数とdict引数の併用

>>> def func(i=0 , **keys ):
…    print locals()

>>> func(b)
{’keys’: {}, ‘i’: {’i’: 2, ‘k’: 4, ‘j’: 3}} #最初の変数iにdict b が渡される。
>>> func(**b)
{’keys’: {’k’: 4, ‘j’: 3}, ‘i’: 2}   # bの中でi以外のアイテムがdict変数に渡される。

dict引数は後にする

SyntaxError: invalid syntax
>>> def func(**var, i=0):
  File "<stdin>", line 1
    def func(**var, i=0):
                  ^

デフォルト引数は名無し引数より後

SyntaxError: invalid syntax
>>> def func(i=0,j):
…   print locals()

  File "<stdin>", line 1
SyntaxError: non-default argument follows default argument

タプル引数

>>> def func( *var ):
…    print type(var),locals()

>>> func(*b)
<type ‘tuple’> {’var’: (‘i’, ‘k’, ‘j’)}

>>> func(*b.values())
<type ‘tuple’> {’var’: (0, 2, 1)}

タプル引数はdict引数より前に

>>> def func(**data,*var):
  File "<stdin>", line 1
    def func(**data,*var):
                   ^
SyntaxError: invalid syntax
>>> def func(*var,**data):
…    print type(var),type(data),locals()

>>> func(b)
<type ‘tuple’> <type ‘dict’> {’var’: ({’i’: 0, ‘k’: 2, ‘j’: 1},), ‘data’: {}} # varのタプルの1つ目としてdictが丸ごと入る
>>> func(*b)
<type ‘tuple’> <type ‘dict’> {’var’: (‘i’, ‘k’, ‘j’), ‘data’: {}} # dictのキーがtuple変換されてvarに入る
>>> func(**b)
<type ‘tuple’> <type ‘dict’> {’var’: (), ‘data’: {’i’: 0, ‘k’: 2, ‘j’: 1}} # dict変数に変換させれてそれぞれに入る

>>> a=dict(x=1,y=2,z=3)

>>> func(**a,*b)
  File "<stdin>", line 1
    func(**a,*b)
            ^
SyntaxError: invalid syntax

>>> func(*a,**b)
<type ‘tuple’> <type ‘dict’> {’var’: (‘y’, ‘x’, ‘z’), ‘data’: {’i’: 0, ‘k’: 2, ‘j’: 1}}

カテゴリー: 未分類 パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中