├── 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 2021-02-18 19:25:30 +08:00
难点在语法分析里。。不过只是识别 docstring 的话,感觉正则就行了。。
|
2
nthhdy 2021-02-18 19:52:17 +08:00
楼主 import 之后直接赋值 docstring 的方法,据我所知做不到改源文件的。
可以考虑用 ast module,parse 出来之后改,然后再生成代码。 |
3
xchaoinfo 2021-02-18 20:16:05 +08:00 via Android
ast
|
4
codists 2021-02-19 06:29:48 +08:00
|
5
julyclyde 2021-02-19 15:47:14 +08:00
嘿,这是打算盗版谁家的软件产品啊
|
7
css3 OP |
8
nthhdy 2021-02-19 17:44:21 +08:00
> 貌似把原来的多行 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 2021-02-19 20:55:23 +08:00
我看了一下 ast 的文档,int float string 这些 literal 在解析树上都表示为 Constant 对象,也就是说,string 是单引号、双引号还是三个引号,这个信息在解析树上已经丢失了。所以你想做这件事,ast 的确做不到。不知道是否有边角的配置或者 hack 的办法可以。
但这个思路是正解,先 parse 出来,做改动,再 dump 成代码。我没注意到 ast 的这个细节,所以只是工具不适合,可以再搜索一下同类型的工具。这么多做 code format 的工具呢,它们应该实现过类似的机制才对。 这个思路是个比较通用的解法,再复杂一些的需求也可以用这个路子。如果要解决的问题是一次性的,变体又有限,可以尝试用 adhoc 的办法。比如用正则,甚至写一个自己代码都适用的规则。看问题的规模和复杂度而定吧。 |