PyFlowchart is a package to:
PyFlowchart produces flowcharts in flowchart.js flowchart DSL, a widely used flow chart textual representation. It's easy to convert these flowcharts text into a picture via flowchart.js.org, francoislaberge/diagrams, or some markdown editors.
$ pip3 install pyflowchart
To flowchartlize your python codes in example.py
,run:
$ python3 -m pyflowchart example.py
PyFlowchart will output the generated flowchart.js DSL. Go to http://flowchart.js.org or use editors like Typora to turn the output code into a rendered diagram.
To specify a function (or a method in a class) to flowchartlize:
$ python3 -m pyflowchart example.py -f function_name
# or
$ python3 -m pyflowchart example.py -f ClassName.method_name
🎉 Now you are ready to enjoy the flowchartlization.
Keep reading this document to learn more usages.
PyFlowchart allows you to write a flowchart in Python which could be translated into the flowchart.js DSL automatically.
PyFlowchart supports flowchart.js node types:
Nodes can be connected by connect()
method (connect_{yes|no}
for ConditionNode). An optional second parameter to connect()
is used to specify the connect_direction.
Get a Flowchart with your start node and call its flowchart()
method to generate flowchart.js flowchart DSL:
from pyflowchart import *
st = StartNode('a_pyflow_test')
op = OperationNode('do something')
cond = ConditionNode('Yes or No?')
io = InputOutputNode(InputOutputNode.OUTPUT, 'something...')
sub = SubroutineNode('A Subroutine')
e = EndNode('a_pyflow_test')
st.connect(op)
op.connect(cond)
cond.connect_yes(io)
cond.connect_no(sub)
sub.connect(op, "right") # sub->op line starts from the right of sub
io.connect(e)
fc = Flowchart(st)
print(fc.flowchart())
Output:
st0=>start: start a_pyflow_test
op1=>operation: do something
cond2=>condition: Yes or No?
io3=>inputoutput: output: something...
e5=>end: end a_pyflow_test
sub4=>subroutine: A Subroutine
st0->op1
op1->cond2
cond2->
cond2->
cond2(yes)->io3
io3->e5
cond2(no)->sub4
sub4(right)->op1
Then you can visit http://flowchart.js.org and translate the generated textual representation into SVG flow chart diagrams:
P.S. Many Markdown editors (for example, Typora) support this flowchart syntax, too (reference: Typora doc about flowchart). And if you prefer CLI, see francoislaberge/diagrams.
Since v0.2.0, we support a Node.set_param(key, value)
method to generate flowchart like this:
element(param1=value1,param2=value2)=>start: Start
(See also adrai/flowchart.js#node-specific-specifiers-by-type)
And for convenience, there are grammar sugars to set param align-next=no
for ConditionNodes:
cond = ConditionNode("a cond node")
cond.no_align_next()
# or do this at __init__:
cond = ConditionNode("a cond node", align_next=False)
This usually works with a connect_direction customization:
cond.connect_yes(op, "right")
The generated flowchart will look like:
cond(align-next=no)=>condition: Yes or No?
...
cond(yes,right)->op
PyFlowchart can also translate your Python Codes into Flowcharts.
For example, you got a simple.py
:
def foo(a, b):
if a:
print("a")
else:
for i in range(3):
print("b")
return a + b
Run PyFlowchart in CLI to generate flowchart code:
$ python3 -m pyflowchart simple.py
# output flowchart code.
Or, in Python
>>> from pyflowchart import Flowchart
>>> with open('simple.py') as f:
... code = f.read()
...
>>> fc = Flowchart.from_code(code)
>>> print(fc.flowchart())
# output flowchart code.
As mentioned above, we use Flowchart.from_code
to translate Python codes into Flowcharts. The from_code
is defined as:
Flowchart.from_code(code, field="", inner=True, simplify=True, conds_align=False)
PyFlowchart CLI is a 1:1 interface for this function:
python3 -m pyflowchart [-f FIELD] [-i] [--no-simplify] [--conds-align] code_file
Let's talk about those three args:
field
: str: Specify a field of code to generate a flowchartinner
: bool: True
to parse the body of field; whereas False
to parse the body as a single object.simplify
: bool: for If & Loop statements: simplify the one-line-body or notconds_align
: bool: improve the flowchart of consecutive If statements converted from python code. (Beta)the field
is the path to a field (i.e. a function) you want to draw a flowchart.
# example.py
print("start")
def foo():
foo = "foo"
class Bar():
def buzz(self, f):
def g(self):
print("g")
f(self)
return g(self)
Bar().buzz(foo)
print("end")
For example.py
above, available paths are:
- "" (means the whole code)
- "foo"
- "Bar.buzz"
- "Bar.buzz.g"
To generate a flowchart of Bar.buzz.g
:
# Python
from pyflowchart import Flowchart
with open('example.py') as f:
code = f.read()
fc = Flowchart.from_code(code, field='Bar.buzz.g', inner=False)
print(fc.flowchart())
Or:
# CLI
python3 -m pyflowchart example.py -f Bar.buzz.g
Output result:
inner
controls parser's behaving. Techly, inner=True
means parsing field.body
, while inner=False
parses [field]
. So, if inner=True
, pyflowchart will look into the field, otherwise, it takes the field
as a node.
For CLI, adding an argument -i
means inner=True
, else inner=False
.
simplify is for If & Loop statements: simplify the one-line-body.
For example:
# example_simplify.py
a = 1
if a == 1:
print(a)
while a < 4:
a = a + 1
simplify=True
:flowchart = Flowchart.from_code(example_simplify_py, field="", inner=True)
print(flowchart.flowchart())
# SH $ python3 -m pyflowchart example_simplify.py
simplify=False
:flowchart = Flowchart.from_code(example_simplify_py, field="", inner=True, simplify=False)
print(flowchart.flowchart())
# SH $ python3 -m pyflowchart --no-simplify example_simplify.py
Improve the flowchart of consecutive If statements converted from python code with the new feature of v0.2.0
.
# example-conds-align.py
if cond1:
op1
if cond2:
op2
if cond3:
op3
op_end
Sometimes, the generated flowchart is awful. In those cases, you are encouraged to modify the generated flowchart code by yourself OR consider making your python source code at bottom more clear if it's exceedingly complex.
$ pyflowchart example.py -o flowchart.svg
Depends on node.js
and flowchart.js
.
Well, I guess a GUI for PyFlowchart may be remarkable. Pasting your code into it, the flowchart DSL will be generated just in time, and the flowchart will be shown aside.
Sadly, I am too busy (pronounced as [ˈlеizi]
——lazy) to code these ideas. Please submit an issue to push me on. Or, PR to make it by yourself. I cannot wait to appreciate your great contribution!
Copyright 2020-2022 CDFMLR. All rights reserved.
Licensed under the MIT License.
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。