
├── test.py ├── modify.py # test.py 待修改 docstring 的函数文件 def hello_world(): """ this function is a demo, 需要修改这里,并保存到文件 """ return 'hello world' """ # 这是一个干扰注释,不能修改这里 """ # modify.py 修改 test.py 的 docstring 函数 from test import hello_world def modify_docstring(): print(hello_world.__doc__) # this function is a demo, 需要修改这里,并保存到文件 hello_world.__doc__ = 'I\' am new docstring' print(hello_world.__doc__) # I' am new docstring # 这样可以赋值,但只是在内存中,怎么修改写入 test.py 文件呢? 1 guyeu Feb 18, 2021 难点在语法分析里。。不过只是识别 docstring 的话,感觉正则就行了。。 |
2 nthhdy Feb 18, 2021 楼主 import 之后直接赋值 docstring 的方法,据我所知做不到改源文件的。 可以考虑用 ast module,parse 出来之后改,然后再生成代码。 |
3 xchaoinfo Feb 18, 2021 via Android ast |
4 codists Feb 19, 2021 |
5 julyclyde   Feb 19, 2021 嘿,这是打算盗版谁家的软件产品啊 |
7 css3 OP |
8 nthhdy Feb 19, 2021 > 貌似把原来的多行 doc 给用'\n'合并成了一行去了,还没找到解决办法 感觉这个想办法解决一下就行了,就当是 IDE 的一个小功能呗,挺常见的,应不难搞。 |
9 css3 OP @nthhdy 最新发现解析后生成的 docstring 的三个引号也变成单引号了,感觉要处理起来也挺麻烦的 https://stackoverflow.com/questions/53564301/insert-docstring-attributes-in-a-python-file |
10 css3 OP |
11 nthhdy Feb 19, 2021 我看了一下 ast 的文档,int float string 这些 literal 在解析树上都表示为 Constant 对象,也就是说,string 是单引号、双引号还是三个引号,这个信息在解析树上已经丢失了。所以你想做这件事,ast 的确做不到。不知道是否有边角的配置或者 hack 的办法可以。 但这个思路是正解,先 parse 出来,做改动,再 dump 成代码。我没注意到 ast 的这个细节,所以只是工具不适合,可以再搜索一下同类型的工具。这么多做 code format 的工具呢,它们应该实现过类似的机制才对。 这个思路是个比较通用的解法,再复杂一些的需求也可以用这个路子。如果要解决的问题是一次性的,变体又有限,可以尝试用 adhoc 的办法。比如用正则,甚至写一个自己代码都适用的规则。看问题的规模和复杂度而定吧。 |