Jack Twain
Jack Twain

Reputation: 6372

Tracking changes in python source files?

I'm learning python and came into a situation where I need to change the behvaviour of a function. I'm initially a java programmer so in the Java world a change in a function would let Eclipse shows that a lot of source files in Java has errors. That way I can know which files need to get modified. But how would one do such a thing in python considering there are no types?! I'm using TextMate2 for python coding.

Currently I'm doing the brute-force way. Opening every python script file and check where I'm using that function and then modify. But I'm sure this is not the way to deal with large projects!!!

Edit: as an example I define a class called Graph in a python script file. Graph has two objects variables. I created many objects (each with different name!!!) of this class in many script files and then decided that I want to change the name of the object variables! Now I'm going through each file and reading my code again in order to change the names again :(. PLEASE help!

Example: File A has objects x,y,z of class C. File B has objects xx,yy,zz of class C. Class C has two instance variables names that should be changed Foo to Poo and Foo1 to Poo1. Also consider many files like A and B. What would you do to solve this? Are you serisouly going to open each file and search for x,y,z,xx,yy,zz and then change the names individually?!!!

Upvotes: 4

Views: 1150

Answers (5)

smci
smci

Reputation: 33970

Whoa, slow down. The coding process you described is not scalable. How exactly did you change the behavior of the function? Give specifics, please.

UPDATE: This all sounds like you're trying to implement a class and its methods by cobbling together a motley patchwork of functions and local variables - like I wrongly did when I first learned OO coding in Python. The code smell is that when the type/class of some class internal changes, it should generally not affect the class methods. If you're refactoring all your code every 10 mins, you're doing something seriously wrong. Step back and think about clean decomposition into objects, methods and data members.

(Please give more specifics if you want a more useful answer.)

If you give us the specifics we can critique it better.

Upvotes: 1

user4815162342
user4815162342

Reputation: 155296

One of the tradeoffs between statically and dynamically typed languages is that the latter require less scaffolding in the form of type declarations, but also provide less help with refactoring tools and compile-time error detection. Some Python IDEs do offer a certain level of type inference and help with refactoring, but even the best of them will not be able to match the tools developed for statically typed languages.

Dynamic language programmers typically ensure correctness while refactoring in one or more of the following ways:

  1. Use grep to look for function invocation sites, and fix them. (You would have to do that in languages like Java as well if you wanted to handle reflection.)

  2. Start the application and see what goes wrong.

  3. Write unit tests, if you don't already have them, use a coverage tool to make sure that they cover your whole program, and run the test suite after each change to check that everything still works.

Upvotes: 0

aychedee
aychedee

Reputation: 25619

Sounds like you can only code inside an IDE!

Two steps to free yourself from your IDE and become a better programmer.

  1. Write unit tests for your code.

  2. Learn how to use grep

Unit tests will exercise your code and provide reassurance that it is always doing what you wanted it to do. They make refactoring MUCH easier.

grep, what a wonderful tool grep -R 'my_function_name' src will find every reference to your function in files under the directory src.

Also, see this rather wonderful blog post: Unix as an IDE.

Upvotes: 1

Joël
Joël

Reputation: 2822

One answer only specific to your edit:

  • if your old code was working and does not need to be modified, you could just keep old names as alias of the new ones, resulting in your old code not to be broken. Example:

    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
    
  • if your code need rework, rewrite your common code, execute everything, and correct any failure. You could also look for any import/instantiation of your class.

Upvotes: 0

Aaron
Aaron

Reputation: 2351

You won't get this functionality in a text editor. I use sublime text 3, and I love it, but it doesn't have this functionality. It does however jump to files and functions via its 'Goto Anything' (Ctrl+P) functionality, and its Multiple Selections / Multi Edit is great for small refactoring tasks.

However, when it comes to IDEs, JetBrains pycharm has some of the amazing re-factoring tools that you might be looking for.

The also free Python Tools for Visual Studio (see free install options here which can use the free VS shell) has some excellent Refactoring capabilities and a superb REPL to boot.

I use all three. I spend most of my time in sublime text, I like pycharm for refactoring, and I find PT4VS excellent for very involved prototyping.

Despite python being a dynamically typed language, IDEs can still introspect to a reasonable degree. But, of course, it won't approach the level of Java or C# IDEs. Incidentally, if you are coming over from Java, you may have come across JetBrains IntelliJ, which PyCharm will feel almost identical to.

One's programming style is certainly different between a statically typed language like C# and a dynamic language like python. I find myself doing things in smaller, testable modules. The iteration speed is faster. And in a dynamic language one relies less on IDE tools and more on unit tests that cover the key functionality. If you don't have these you will break things when you refactor.

Upvotes: 0

Related Questions