用于移动python文件的工具。
slicker的Python项目详细描述
slicker:在python中移动东西的工具
如果您曾经试图在python中移动函数或类,您会发现 有点痛苦:你不仅要移动定义(和它的导入, 也可以更新整个代码库中的引用。滑头是用来 就这么做!
安装
pip install slicker
用法
将foo/bar.py
中定义的函数myfunc
移动到foo/baz.py
:
slicker foo.bar.myfunc foo.baz.myfunc
如果myfunc
是常量或类(尽管
当然希望您没有命名类myfunc
!)如果你想的话
更改myfunc
:
slicker foo.bar.myfunc foo.bar.new_name_for_myfunc
(您也可以以自然的方式同时进行这两种更改。)
要将整个模块foo/bar.py
移动到foo/baz.py
,可以执行类似的操作:
slicker foo.bar foo.baz
或者使用如下文件名:
slicker foo/bar.py foo/baz.py
还可以将符号移动到现有模块或模块中 现有目录,就像^ {CD10}}。所以这相当于第一个 示例:
slicker foo.bar.myfunc foo.baz
并在现有目录中将^ {< CD3>}移动到新文件^ {< CD12>}
newfoo/
,你可以这样做
slicker foo.bar newfoo # (or slicker foo/bar.py newfoo/)
使用此语法,还可以指定要移动的多个对象,以便 用
将foo/bar.py
和foo/baz.py
移动到newfoo/
slicker foo/bar.py foo/baz.py newfoo/
您可以告诉slicker在使用-a
/--alias
:
slicker foo.bar.myfunc foo.baz.myfunc --alias baz
在这种情况下,slicker将在任何地方添加from foo import baz
,而不是
import foo.baz
。(在这种情况下,您也可以使用--alias foobaz
我们本可以做到import foo.baz as foobaz
。)
如果你想自己移动实际的定义,只要有更光滑的
更新引用,可以传递--no-automove
。最好是跑
slicker
完成上述动作后。
有关选项的完整列表,请运行slicker --help
。
常见和不常问的问题
如果slicker说“这个导入可以隐式使用”,那它是什么意思?
如果你做了import foo.bar
,和其他一些文件(可能是另一个
import)执行import foo.baz
,那么您的foo
现在也有一个foo.baz
,依此类推
即使文件中没有导入,也可以不受惩罚地执行foo.baz.func()
直接提到那个模块。(这是因为两个文件中的foo
都引用了
同一个对象--a.k.a.sys.modules['foo']
,当另一个文件
是否import foo.baz
将baz
附加到共享对象。)
要求slicker将foo.bar
移动到newfoo.bar
,在更新此文件时
想用import newfoo.bar
替换import foo.bar
,但是
不能--实际上您仍在使用导入。所以它会警告你
凯斯,让你亲手解决。
斯里克特给我留下了一堆错误的或长长的队伍!
是的,我们还没修好你的皮棉应该告诉你该怎么做 不过,还是要修好。
为什么叫滑头?
因为Python会滑翔四处移动,但这条路,呃,更光滑。那就是 说:这在当时似乎是个好主意,据我所知 名字还没取
它是如何工作的?
参见blog post了解 概述。如果这还不够的话,就去窃听作者或者阅读源代码!
为什么不直接使用PyCharm或rope?
好问题——我们试过了!两者都是伟大的工程,做了很多事情 斯里克特不会;如果他们为你工作,那么一定要用他们。但对我们来说, 他们是一辆小车,不符合我们的工作流程。有关详细信息,请参见 这是blog post。
为什么不直接用codemod
或sed
/perl
?
好问题——我们试过了!但要把很多东西粘在一起 找出每个文件中要修复的所有正确引用。还有 基本上没有希望在修复字符串引用时做正确的事情。 我们需要知道python导入意味着什么并能够处理它们的 特殊情况。
变更日志
0.9.2
- 再次修复pypi上的描述
0.9.2
- 修复PYP上的描述我
0.9.1
- 正确处理相对导入
- 大量的内部重构
0.9
- PYPI的初始版本