Little confused with import python

2019-03-30 00:02发布

问题:

I come from a PHP (as well as a bunch of other stuff) background and I am playing around with Python. In PHP when I want to include another file I just do include or require and everything in that file is included.

But it seems the recommended way to do stuff in python is from file import but that seems to be more for including libraries and stuff? How do you separate your code amongst several files? Is the only way to do it, to have a single file with a whole bunch of function calls and then import 15 other files?

回答1:

Things are totally different between PHP and Python, and there are many reasons why.

But it seems the recommended way to do stuff in python is from file import but that seems to be more for including libraries and stuff?

Indeed, import statements are for importing objects from another module to current module. You can either import all the objects of the imported module to current module:

import foo

print foo.bar

or you can select what you want from that module:

from foo import bar

print bar

and even better, if you import a module twice, it will be only imported once:

>> import foo as foo1
>> import foo as foo2
>> foo1 is foo2
True

How do you separate your code amongst several files?

You have to think about your code... That's called software design, and here are a few rules:

  • you never write an algorithm at the module's level; instead make it a function, and call that function
  • you never instantiate an object at the module's level; you shall embed it in the function, and call that function
  • if you need an object in several different functions, create a class and encapsulate that object in that class, then use it in your functions bound to that class (so they now are called methods)

The only exception is when you want to launch a program from command line, you append:

if __name__ == "__main__":

at the end of the module. And my best advice would be to just call your first function afterwards:

if __name__ == "__main__":
    main()

Is the only way to do it, to have a single file with a whole bunch of function calls and then import 15 other files?

It's not the only way to do it, but it's the best way to do it. You make all your algorithms into libraries of functions and objects, and then import exactly what you need in other libraries etc.. That's how you create a whole universe of reusable code and never have to reinvent the wheel! So forget about files, and think about modules that contains objects.

Finally, my best advice to you learning python is to unlearn every habit and usage you had while coding PHP, and learn those things again, differently. In the end, that can only make you a better software engineer.



回答2:

I guess I understand what you are tring to say and to do.

Here is the random include example from PHP:

File #1 - vars.php

<?php

$color = 'green';
$fruit = 'apple';

?>

File #2 - main.php

<?php

echo "A $color $fruit"; // A

include 'vars.php';

echo "A $color $fruit"; // A green apple

?>

The fist echo command will print just "A" string, for it does not have any values assigned to the vars. The next echo will print a full string thanks to your include before it.

Python's "import", however, imports a module or it's part, so you could work with it in your current module.

Here is a python example:

File 1 - echo.py

    apple = 'apple'
    color = 'green'

File 2 - main.py

import echo

def func():
    print "A "+echo.color+" "+echo.fruit

if __name__ == '__main__':
    func()

In other words - you import some functionality from one module and then use it in your other module.

The example above is not really good from programming standarts or best practises, but I think it gives you some understanding.



回答3:

Interesting question. As you know, in PHP, you can separate your code by using include, which literally takes all the code in the included file and puts it wherever you called include. This is convenient for writing web applications because you can easily divide a page into parts (such as header, navigation, footer, etc).

Python, on the other hand, is used for way more than just web applications. To reuse code, you must rely on functions or good old object-oriented programming. PHP also has functions and object-oriented programming FYI.

You write functions and classes in a file and import it in another file. This lets you access the functions or use the classes you defined in the other file.

Lets say you have a function called foo in file file1.py. From file2.py, you can write import file1. Then, call foo with file1.foo(). Alternatively, write from file1 import foo and then you can call foo with foo(). Note that the from lets you call foo directly. For more info, look at the python docs.



回答4:

On a technical level, a Python import is very similar to a PHP require, as it will execute the imported file. But since Python isn't designed to ultimately generate an HTML file, the way you use it is very different.

Typically a Python file will on the module level not include much executable code at all, but definitions of functions and classes. You them import them and use them as a library.

Hence having things like header() and footer() makes no sense in Python. Those are just functions. Call them like that, and the result they generate will be ignored.

So how do you split up your Python code? Well, you split it up into functions and classes, which you put into different files, and then import.



回答5:

There's an execfile() function which does something vaguely comparable with PHP's include, here, but it's almost certainly something you don't want to do. As others have said, it's just a different model and a different programming need in Python. Your code is going to go from function to function, and it doesn't really make a difference in which order you put them, as long as they're in an order where you define things before you use them. You're just not trying to end up with some kind of ordered document like you typically are with PHP, so the need isn't there.