はじめに
この記事は、以下の記事の続きです。
http://qiita.com/testnin2/items/92ea8f937c70c3a7e254
引数の順番
今まで、引数としてidとかmaskが出てきましたが、その引数の順番は重要なのでしょうか?
import SoftLayer
client = SoftLayer.create_client_from_env()
print(client['User_Customer'].getObject(id=207750, mask='id, username'))
結果
# python test1.py
{'username': 'student-80', 'id': 207750}
import SoftLayer
client = SoftLayer.create_client_from_env()
print(client['User_Customer'].getObject(mask='id, username', id=207750))
結果
# python test2.py
{'username': 'student-80', 'id': 207750}
この結果からすると、idでもmask値でも、どちらを先に書いても良さそうですね。
では、次のSoftLayer_User_Customer::updatePasswordはどうでしょうか?
パラメーターとして新パスワードを設定する必要がありますが、、、
http://sldn.softlayer.com/reference/services/SoftLayer_User_Customer/updatePassword
import SoftLayer
client = SoftLayer.create_client_from_env()
NEW_PASSWORD="xuTU9eHd@"
print(client['User_Customer'].updatePassword(id=207750, NEW_PASSWORD))
結果
# python test3.py
File "updatePassword2.py", line 4
print(client['User_Customer'].updatePassword(id=207750, NEW_PASSWORD))
SyntaxError: non-keyword arg after keyword arg
エラーになってしまいましたね。。。SoftLayerパッケージのpythonモジュールのソースコードを読んでみると、method呼び出しの内部実装は
def call(self, service, method, *args, **kwargs):
のように定義されていることが分かります。
- *argsはtuple型の変数(キーワード無しの引数。単体で記述。)
- **kwargsはdict型の変数(キーワード付きの引数。xxx=yyyのように辞書として記述)
を表すので、キーワード付き引数はキーワード無し引数の前に書く必要があるのですね。
import SoftLayer
client = SoftLayer.create_client_from_env()
NEW_PASSWORD="xuTU9eHd2@"
print(client['User_Customer'].updatePassword(NEW_PASSWORD, id=207750))
結果
# python test4.py
True
というので、ここでもう一つルールをまとめておきましょう。
- 「ルール7:methodの引数は、「キーワード無し引数」「キーワードあり引数」の順に記述する。」
他のキーワード(limit/offset)の使い方
今まで、maskやidなどを使ってきましたが、他にどういうキーワードが使えるのでしょうか。大量にデータが存在する場合は、戻り数を制限したり、フィルタリングするのは有効な手段です。後者のフィルタリングは説明に紙面を要するので、今回は簡単なlimitやoffsetを試してみたいと思います。出力件数を制限するものなので、戻り値が配列(array)になっているmethodに基本的には利用します。Optional HeadersにresultLimitがあるかどうかで、より正確にlimitキーワードが使えるかどうかを確認できます。
http://sldn.softlayer.com/reference/services/SoftLayer_Account/getUsers
結果件数に制限をかけていない場合の実装例
import SoftLayer
client = SoftLayer.create_client_from_env()
users = client['Account'].getUsers()
for user in users:
print('ID : %s username : %s ' % (user['id'], user['username']))
結果
# python test5.py
ID : 191164 username : AAAAA-00
ID : 191618 username : AAAAA-01
ID : 191620 username : AAAAA-02
ID : 191622 username : AAAAA-03
ID : 191624 username : AAAAA-04
ID : 191626 username : AAAAA-05
ID : 191628 username : AAAAA-06
ID : 191630 username : AAAAA-07
ID : 191632 username : AAAAA-08
ID : 191634 username : AAAAA-09
(以下略)
結果が2件までという制限をかけている場合の実装例
limitは出力行数を制限するためのキーワードです。
import SoftLayer
client = SoftLayer.create_client_from_env()
users = client['Account'].getUsers(limit=2)
for user in users:
print('ID : %s username : %s ' % (user['id'], user['username']))
結果
# python test6.py
ID : 191164 username : AAAAA-00
ID : 191618 username : AAAAA-01
offset値から2件ずつ取得する場合の実装例
offsetは出力結果をどこから開始するかを補正するためのキーワードです。順番にページ送りをしたい場合は、取得した件数に応じてoffset値を増やす必要があります。
import SoftLayer
client = SoftLayer.create_client_from_env()
users = client['Account'].getUsers(limit=2, offset=0)
for user in users:
print('ID : %s username : %s ' % (user['id'], user['username']))
print "---------------------"
users = client['Account'].getUsers(limit=2, offset=2)
for user in users:
print('ID : %s username : %s ' % (user['id'], user['username']))
print "---------------------"
users = client['Account'].getUsers(limit=2, offset=4)
for user in users:
print('ID : %s username : %s ' % (user['id'], user['username']))
結果
# python test7.py
ID : 191164 username : AAAAA-00
ID : 191618 username : AAAAA-01
---------------------
ID : 191620 username : AAAAA-02
ID : 191622 username : AAAAA-03
---------------------
ID : 191624 username : AAAAA-04
ID : 191626 username : AAAAA-05
続きは次回!