0

次の内容の構成ファイル(feedbar.cfg)があります。

[last_session]
last_position_x=10
last_position_y=10

次のPythonスクリプトを実行した後:

#!/usr/bin/env python

import pygtk
import gtk
import ConfigParser
import os
pygtk.require('2.0')

class FeedbarConfig():
 """ Configuration class for Feedbar.
 Used to persist / read data from feedbar's cfg file """
 def __init__(self, cfg_file_name="feedbar.cfg"):
  self.cfg_file_name = cfg_file_name
  self.cfg_parser = ConfigParser.ConfigParser()
  self.cfg_parser.readfp(open(cfg_file_name))

 def update_file(self):
  with open(cfg_file_name,"wb") as cfg_file:
   self.cfg_parser.write(cfg_file)

 #PROPERTIES 
 def get_last_position_x(self):
  return self.cfg_parser.getint("last_session", "last_position_x")
 def set_last_position_x(self, new_x):
  self.cfg_parser.set("last_session", "last_position_x", new_x)
  self.update_file()

 last_position_x = property(get_last_position_x, set_last_position_x)

if __name__ == "__main__":
 #feedbar = FeedbarWindow()
 #feedbar.main()
 config = FeedbarConfig()
 print config.last_position_x
 config.last_position_x = 5
 print config.last_position_x

出力は次のとおりです。

10
5

ただし、ファイルは更新されません。cfgファイルの内容は同じままです。

助言がありますか ?

構成情報をファイルからPythonクラスにバインドする別の方法はありますか?JavaのJAXBのようなもの(ただし、XMLの場合はなく、.iniファイルのみ)。

ありがとう!

4

2 に答える 2

3

Edit2:コードが機能しない理由はFeedbarConfig、オブジェクトから継承して新しいスタイルのクラスにする必要があるためです。プロパティはクラシッククラスでは機能しません。:

したがって、解決策は使用することです

class FeedbarConfig(object)

編集:JAXBはXMLファイルを読み取り、それらをオブジェクトに変換しますか?その場合は、lxml.objectifyを確認することをお勧めします。これにより、構成をXMLとして読み取って保存する簡単な方法が得られます。


Is there another way to bind config information from a file into a python class ?

はい。shelvemarshal、またはpickleを使用して、Pythonオブジェクト(リスト、dictなど)を保存できます。

前回ConfigParserを使おうとしたときに、いくつかの問題が発生しました。

  1. ConfigParserは、複数行の値を適切に処理しません。後続の行に空白を配置する必要があり、解析されると空白が削除されます。したがって、すべての複数行の文字列は、とにかく1つの長い文字列に変換されます。
  2. ConfigParserは、すべてのオプション名を小文字にします。
  3. オプションがファイルに書き込まれる順序を保証する方法はありません。

これらは現在直面している問題ではなく、ファイルの保存は簡単に修正できる場合がありますが、将来の問題を回避するために、他のモジュールの1つを使用することを検討することをお勧めします。

于 2010-08-30T21:26:37.490 に答える
2

[これをコメントに入れますが、現時点ではコメントできません]

余談ですが、デコレータスタイルのプロパティを使用すると、少なくとも私の意見では、見栄えが良くなります。

 #PROPERTIES

 @property 
 def position_x(self):
  return self.cfg_parser.getint("last_session", "last_position_x")

 @position_x.setter
 def position_x(self, new_x):
  self.cfg_parser.set("last_session", "last_position_x", new_x)
  self.update_file()

また、Pythonのドキュメントによると、SafeConfigParserは新しいアプリケーションを探す方法です。

「新しいアプリケーションは、古いバージョンのPythonと互換性がある必要がない場合は、このバージョンを優先する必要があります。」--http ://docs.python.org/library/configparser.html

于 2010-08-30T21:50:50.553 に答える