Symfoware

Symfowareについての考察blog

Pythonで辞書型のオブジェクトをキーワード引数として関数に渡す

タイトルになんの書けばよいか迷ったのですが、
例えばPythonからMySQLdbを使用してデータベースに接続するとき


  1. # -*- coding:utf-8 -*-
  2. import MySQLdb
  3. con = MySQLdb.connect(
  4.     host='192.168.1.110',
  5.     db='ftp',
  6.     user='admin',
  7.     passwd='P@ssw0rd',
  8.     charset='utf8')
  9. cur = con.cursor()
  10. print 'connect ok'
  11. cur.close()
  12. con.close()



キーワード引数が並んでわかりにくいなと。
こんな感じで指定できたらいいのに。


  1. # -*- coding:utf-8 -*-
  2. import MySQLdb
  3. config = {}
  4. config['host'] = '192.168.1.110'
  5. config['db'] = 'ftp'
  6. config['user'] = 'admin'
  7. config['passwd'] = 'P@ssw0rd'
  8. config['charset'] = 'utf8'
  9. con = MySQLdb.connect(config)
  10. cur = con.cursor()
  11. print 'connect ok'
  12. cur.close()
  13. con.close()




ちなみに、上記のプログラムを実行すると

TypeError: connect() argument 1 must be string, not dict


というエラーになります。





引数リストのアンパック



こちらに答えが。
Python の可変引数

よく見ると、ちゃんとマニュアルに記載があります。
4.7.4. 引数リストのアンパック

辞書を引数で渡すとき「**」をつければOK。


  1. # -*- coding:utf-8 -*-
  2. import MySQLdb
  3. config = {}
  4. config['host'] = '192.168.1.110'
  5. config['db'] = 'ftp'
  6. config['user'] = 'admin'
  7. config['passwd'] = 'P@ssw0rd'
  8. config['charset'] = 'utf8'
  9. # 引数に「**」をつける
  10. con = MySQLdb.connect(**config)
  11. cur = con.cursor()
  12. print 'connect ok'
  13. cur.close()
  14. con.close()



このプログラムは実行可能です。





ConfigParserとの組み合わせ



SafeConfigParserを使用して、設定ファイルの取得方法を学びました。
SafeConfigParserでini形式の設定ファイルの読み書き

これと組み合わせ、接続情報を設定ファイルに持ってみます。
読み取る設定ファイルはこんな感じ。

・setting.cfg


[db_ftp]
host = 192.168.1.110
db = ftp
user = admin
passwd = P@ssw0rd
charset = utf8





プログラムは以下のようになりました。


  1. # -*- coding:utf-8 -*-
  2. import ConfigParser
  3. import MySQLdb
  4. # 設定ファイルの内容を読み込み
  5. setting = ConfigParser.SafeConfigParser()
  6. setting.read('setting.cfg')
  7. # 設定内容を辞書型に変換
  8. config = {k:v for k,v in setting.items('db_ftp')}
  9. # 引数に「**」をつける
  10. con = MySQLdb.connect(**config)
  11. cur = con.cursor()
  12. print 'connect ok'
  13. cur.close()
  14. con.close()





実行してみると、ちゃんとデータベースに接続できます。
いい感じです。
関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2015/01/22(木) 20:41:32|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<CodeIgniter 3をnginx + php-fpmで動作させる | ホーム | Python SafeConfigParserでini形式の設定ファイルの読み書き>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1590-494e59c6
この記事にトラックバックする(FC2ブログユーザー)