いくつかのYAMLオブジェクトをロードする際の小さな誤解だと思います。以下のクラスを定義しました。
私がやりたいのは、のオーバーライドされたloadConfig
関数を使用していくつかのオブジェクトをロードすることですYAMLObjects
。これらのいくつかは私の.yaml
ファイルからのものですが、他はYAMLファイルからロードされたオブジェクトから構築する必要があります。
たとえば、以下のクラスでは、「keep」という名前のメンバーオブジェクトをロードします。これは、リージョンに保持するいくつかのアイテムに名前を付ける文字列です。しかし、これもリストに解析して、リストをメンバーオブジェクトとして保存したいと思います。そして、ユーザーがYAMLでこのパラメーターの文字列バージョンとリストバージョンの両方を指定する必要がないようにします。
私の現在の回避策は、__getattr__
内部の関数をオーバーライドし、表示されRegion
ても見つからない場合にデフォルトを作成するようにすることです。しかし、これは不格好で、オブジェクトを初期化するために必要なものよりも複雑です。
ここで私はどのような慣習を誤解していますか。loadConfig
メソッドがYAMLにない追加のものを作成しないのはなぜですか?
import yaml, pdb
class Region(yaml.YAMLObject):
yaml_tag = u'!Region'
def __init__(self, name, keep, drop):
self.name = name
self.keep = keep
self.drop = drop
self.keep_list = self.keep.split("+")
self.drop_list = self.drop.split("+")
self.pattern = "+".join(self.keep_list) + "-" + "-".join(self.drop_list)
###
def loadConfig(self, yamlConfig):
yml = yaml.load_all(file(yamlConfig))
for data in yml:
# These get created fine
self.name = data["name"]
self.keep = data["keep"]
self.drop = data["drop"]
# These do not get created.
self.keep_list = self.keep.split("+")
self.drop_list = self.drop.split("+")
self.pattern = "+".join(self.keep_list) + "-" + "-".join(self.drop_list)
###
### End Region
if __name__ == "__main__":
my_yaml = "/home/path/to/test.yaml"
region_iterator = yaml.load_all(file(my_yaml))
# Set a debug breakpoint to play with region_iterator and
# confirm the extra stuff isn't created.
pdb.set_trace()
そしてtest.yaml
、これがすべてを実行して、私が何を意味するかを確認できるようにするためです。
Regions:
# Note: the string conventions below are for an
# existing system. This is a shortened, representative
# example.
Market1:
!Region
name: USAndGB
keep: US+GB
drop: !!null
Market2:
!Region
name: CanadaAndAustralia
keep: CA+AU
drop: !!null
たとえば、これをIPythonシェルで実行し、ロードされたオブジェクトを探索すると、次のようになります。
In [57]: %run "/home/espears/testWorkspace/testRegions.py"
--Return--
> /home/espears/testWorkspace/testRegions.py(38)<module>()->None
-> pdb.set_trace()
(Pdb) region_iterator
<generator object load_all at 0x1139d820>
(Pdb) tmp = region_iterator.next()
(Pdb) tmp
{'Regions': {'Market2': <__main__.Region object at 0x1f858550>, 'Market1': <__main__.Region object at 0x11a91e50>}}
(Pdb) us = tmp['Regions']['Market1']
(Pdb) us
<__main__.Region object at 0x11a91e50>
(Pdb) us.name
'USAndGB'
(Pdb) us.keep
'US+GB'
(Pdb) us.keep_list
*** AttributeError: 'Region' object has no attribute 'keep_list'