LoginSignup
2
4

More than 3 years have passed since last update.

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

Last updated at Posted at 2015-01-21

はじめに

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

引数の順番

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

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}
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

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のように辞書として記述)

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

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

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

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
(以下略)

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

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

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

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

続きは次回!

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4