LoginSignup
0
0

More than 5 years have passed since last update.

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

Posted at

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>

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0