Python
Graphviz

pydot (Graphviz) でノード名が勝手にダブルクオートで囲まれる問題

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>

なんかダサいが、ひとまずこれで動いた。