PyCharm: 这种自动签名重构可行吗?

PyCharm: is this kind of automatic signature refactoring possible?

一个Python项目的代码有很多函数定义和调用,如:

def some_function(a, b="", c=0, d=None, e="something"):
    # whatever
    pass

some_function("a", "b", 1, e="something else")

这很麻烦(不好的做法 - 缺少上下文等),我想自动将其更改为:

some_function(a="a", b="b", c=1, e="something else")

(好吧,在某些情况下,第一个位置参数可能会保持原样)

很多时候关键字参数的顺序不一样,所以也可以按照函数定义的顺序排列:

def some_method(self, a, b=1, c=2): pass
obj.some_method(a, c=12, b=0) -> obj.some_method(a, b=0, c=12)

PyCharm 的 Refactor > Change signature 有什么帮助吗?

好吧,PyCharm 会重新排序 kw 参数,但不会将位置参数更改为关键字参数(在调用中)。仅仅是电流限制还是我缺少某种自动执行此操作的方法?

这是一种方式:

  1. 将光标移至函数定义并重构 > 更改签名

  2. 在第一个参数之前添加一些具有默认值的虚拟参数(例如,REMOVEME),这应该是 kw 参数,但在所有位置参数之后(没有默认值)

  3. 重构

  4. 再次进行签名重构,去除伪参数并重构。

现在所有的调用都在正确重新排序的地方使用位置参数。

注意:并非 100% 有效,在某些情况下会留下逗号,这可能是一个错误。另外有时会在通话中删除 **kwargs...

因为 Python 3 的 keyword-only arguments 现在受到 PyCharm 的支持,您可以通过在 Change signature 中添加 * 作为第一个参数来执行上述重构对话框。