Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
跟踪python源文件中的更改?_Python_Migration_Dynamic Typing - Fatal编程技术网

跟踪python源文件中的更改?

跟踪python源文件中的更改?,python,migration,dynamic-typing,Python,Migration,Dynamic Typing,我正在学习python,遇到了需要更改函数的behvaviour的情况。我最初是一名java程序员,因此在java世界中,函数的更改会让Eclipse显示java中的许多源文件都有错误。这样我就可以知道哪些文件需要修改。但是,考虑到python中没有类型,我们如何在python中做这样的事情呢?!我正在使用TextMate2进行python编码 目前我正在用蛮力的方式。打开每个python脚本文件,检查我在哪里使用该函数,然后修改。但我相信这不是处理大型项目的方式 Edit:作为示例,我在pyt

我正在学习python,遇到了需要更改函数的behvaviour的情况。我最初是一名java程序员,因此在java世界中,函数的更改会让Eclipse显示java中的许多源文件都有错误。这样我就可以知道哪些文件需要修改。但是,考虑到python中没有类型,我们如何在python中做这样的事情呢?!我正在使用TextMate2进行python编码

目前我正在用蛮力的方式。打开每个python脚本文件,检查我在哪里使用该函数,然后修改。但我相信这不是处理大型项目的方式


Edit:作为示例,我在python脚本文件中定义了一个名为
Graph
的类<代码>图形有两个对象变量。我在许多脚本文件中创建了这个类的许多对象(每个对象都有不同的名称!!!),然后决定更改对象变量的名称!现在,为了再次更改名称,我将遍历每个文件并再次读取代码:(.请帮助


<文件>代码> a <代码> a <代码> x,y,z < /代码>类<代码>代码> b>代码>对象有“代码> xx,yy,Zz 类<代码> c>代码>。两个实例变量名应更改为<代码> FoO > <代码> POO和<代码> Foo1 > <代码> POO1。也考虑了许多文件。像
A
B
。你会怎么解决这个问题?你真的要打开每个文件,搜索x、y、z、xx、yy、zz,然后分别更改名称吗?!

在文本编辑器中你不会得到这个功能。我使用3,我喜欢它,但它没有这个功能。但是它会跳转到文件和函数通过它的“Goto Anything”(Ctrl+P)功能,以及它的多选/多编辑功能,对小型重构任务非常有用

然而,当谈到IDE时,JetBrains有一些您可能正在寻找的惊人的重新分解工具

同样免费的(请参阅此处的免费选项,可以使用免费VS shell)具有一些出色的功能和极好的REPL引导功能

我把大部分时间都花在了崇高的文本上,我喜欢pycharm进行重构,我发现PT4VS非常适合于非常复杂的原型设计

尽管python是一种动态类型的语言,IDE仍然可以进行合理程度的内省。但是,当然,它不会接近Java或C#IDE的水平。顺便说一句,如果你是从Java来的,你可能会遇到JetBrains IntelliJ,PyCharm会觉得它与JetBrains IntelliJ几乎相同


在C#这样的静态类型语言和python这样的动态语言之间,一个人的编程风格肯定是不同的。我发现自己在更小的、可测试的模块中工作。迭代速度更快。在动态语言中,一个人更少地依赖IDE工具,更多地依赖涵盖关键功能的单元测试。如果你没有当你重构的时候,你会破坏一些东西。

静态类型语言和动态类型语言之间的一个折衷是后者需要更少的类型声明形式的支架,但在重构工具和编译时错误检测方面提供的帮助也更少。一些Python IDE确实提供了一定程度的类型推断和有助于重构,但即使是最好的重构工具也无法与为静态类型语言开发的工具相匹配

动态语言程序员通常通过以下一种或多种方式在重构时确保正确性:

  • 使用
    grep
    查找函数调用站点,并修复它们(如果要处理反射,还必须使用Java等语言)

  • 启动应用程序,看看哪里出了问题

  • 编写单元测试,如果您还没有单元测试,请使用覆盖工具确保单元测试覆盖了整个程序,并在每次更改后运行测试套件,以检查是否一切正常


  • 哇,慢点。你描述的编码过程是不可伸缩的。 您到底是如何更改函数的行为的?请给出详细信息

    更新:这听起来像是你试图通过拼凑一堆杂七杂八的函数和局部变量来实现一个类及其方法——就像我第一次在Python中学习OO编码时错误地做的那样。代码的味道是,当一些类的内部类型/类发生变化时,它通常不会影响类方法。如果如果你每10分钟重构一次你的代码,你就犯了严重的错误。退后一步,考虑清楚地分解成对象、方法和数据成员

    (如果您想要更有用的答案,请提供更多细节。)

    • 如果只更改输入类型,则可能不需要更改调用代码。 (除非新fn做了与旧fn完全不同的事情,在这种情况下,反对使用不同名称的理由是什么?)

    • 如果您更改了返回类型,并且找不到用于放置返回值的公共祖先类型或容器(元组、序列等),则需要更改其调用方代码。但是

    • …但是,如果函数真的应该是一个类的方法,请声明该类和该方法。上一段是一段代码,说明函数真的应该是一个方法,特别是多态方法

    • 阅读关于,反模式和。例如,你会发现视频的推荐

    • 另外,听起来您希望使用测试驱动设计并添加一些单元测试


    如果您提供详细信息,我们可以更好地对其进行评论。

    仅针对您的编辑给出一个答案:

    • 若您的旧代码正常工作并且不需要修改,那个么您可以只保留旧名称作为新名称的别名,从而导致您的o
      class MyClass(object):
          def __init__(self):
              self.t = time.time()
          # creating new names
          def new_foo(self, arg):
              return 'new_foo', arg
          def new_bar(self, arg):
              return 'new_bar', arg
          # now creating functions aliases
          foo = new_foo
          bar = new_bar