pydot + Graphviz を使っていて発生した問題と対処方法について。
環境
- Python 3.7.1
- Graphviz 2.40.1
- pydot 1.4.1
発生した問題
graph = pydot.Dot()
node_name = '123abc'
node = pydot.Node(node_name)
graph.add_node(node)
このように定義したグラフに対して、ノード名からノードを取得しようとすると
graph.get_node(node_name)[0] # IndexError: list index out of range
このようにうまくいかない。
get_node()
が空配列 []
を返してくるらしく、意図した通りにノードが取得できていない。
原因
調べると、ノード名の文字列がなんらかの条件を満たしていると、勝手にダブルクオートで囲まれるということがわかった。
print(pydot.Node('abc123').get_name()) # abc123 ← わかる
print(pydot.Node('123abc').get_name()) # "123abc" ← なぜダブルクオートで囲んだ
print(pydot.Node('"abc123"').get_name()) # "abc123" ← わかる
print(pydot.Node('"123abc"').get_name()) # "123abc" ← ダブルクオートは二重にはならないらしい
なぜ・・・?
これが pydot 特有の挙動なのか Graphviz の挙動なのかはわからない。
詳しい人がいたら教えて欲しい。
対応策
ノード名はすべてダブルクオートで囲むことにした。
graph = pydot.Dot()
node_name = '123abc'
node = pydot.Node(f'"{node_name}"', label=node_name)
graph.add_node(node)
graph.get_node(f'"{node_name}"')[0] # <pydot.Node at 0x7fb381a8fda0>
なんかダサいが、ひとまずこれで動いた。