ShinobiLayer: SoftLayer API 次の一歩: methodの実行方法と返り値の制御(2)

#はじめに
この記事は、以下の記事の続きです。
http://qiita.com/testnin2/items/92ea8f937c70c3a7e254

#引数の順番
今まで、引数としてidとかmaskが出てきましたが、その引数の順番は重要なのでしょうか？

```py:test1.py
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}
```
```py:test2.py
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
![updatePassword.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/fed6aa7a-3840-1ed2-9c9a-f96875359f2e.jpeg)


```py:test3.py
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のように辞書として記述）

を表すので、キーワード付き引数はキーワード無し引数の前に書く必要があるのですね。

```py:test4.py
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
![getUsers.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/e216a554-cec0-7878-f9a3-6aa8a4145b0d.jpeg)



####結果件数に制限をかけていない場合の実装例

```py:test5.py
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
（以下略）
```

####結果が２件までという制限をかけている場合の実装例

limitは出力行数を制限するためのキーワードです。

```py:test6.py
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値を増やす必要があります。

```py:test7.py
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
```




続きは次回！