Use 'import module' or 'from module import'?

前端 未结 19 2120
一向
一向 2020-11-21 07:47

I\'ve tried to find a comprehensive guide on whether it is best to use import module or from module import. I\'ve just started with Python and I\'m

相关标签:
19条回答
  • 2020-11-21 07:55

    Here is another difference not mentioned. This is copied verbatim from http://docs.python.org/2/tutorial/modules.html

    Note that when using

    from package import item
    

    the item can be either a submodule (or subpackage) of the package, or some other name defined in the package, like a function, class or variable. The import statement first tests whether the item is defined in the package; if not, it assumes it is a module and attempts to load it. If it fails to find it, an ImportError exception is raised.

    Contrarily, when using syntax like

    import item.subitem.subsubitem
    

    each item except for the last must be a package; the last item can be a module or a package but can’t be a class or function or variable defined in the previous item.

    0 讨论(0)
  • 2020-11-21 08:00

    The difference between import module and from module import foo is mainly subjective. Pick the one you like best and be consistent in your use of it. Here are some points to help you decide.

    import module

    • Pros:
      • Less maintenance of your import statements. Don't need to add any additional imports to start using another item from the module
    • Cons:
      • Typing module.foo in your code can be tedious and redundant (tedium can be minimized by using import module as mo then typing mo.foo)

    from module import foo

    • Pros:
      • Less typing to use foo
      • More control over which items of a module can be accessed
    • Cons:
      • To use a new item from the module you have to update your import statement
      • You lose context about foo. For example, it's less clear what ceil() does compared to math.ceil()

    Either method is acceptable, but don't use from module import *.

    For any reasonable large set of code, if you import * you will likely be cementing it into the module, unable to be removed. This is because it is difficult to determine what items used in the code are coming from 'module', making it easy to get to the point where you think you don't use the import any more but it's extremely difficult to be sure.

    0 讨论(0)
  • 2020-11-21 08:04

    I would like to add to this, there are somethings to consider during the import calls:

    I have the following structure:

    mod/
        __init__.py
        main.py
        a.py
        b.py
        c.py
        d.py
    

    main.py:

    import mod.a
    import mod.b as b
    from mod import c
    import d
    

    dis.dis shows the difference:

      1           0 LOAD_CONST               0 (-1)
                  3 LOAD_CONST               1 (None)
                  6 IMPORT_NAME              0 (mod.a)
                  9 STORE_NAME               1 (mod)
    
      2          12 LOAD_CONST               0 (-1)
                 15 LOAD_CONST               1 (None)
                 18 IMPORT_NAME              2 (b)
                 21 STORE_NAME               2 (b)
    
      3          24 LOAD_CONST               0 (-1)
                 27 LOAD_CONST               2 (('c',))
                 30 IMPORT_NAME              1 (mod)
                 33 IMPORT_FROM              3 (c)
                 36 STORE_NAME               3 (c)
                 39 POP_TOP
    
      4          40 LOAD_CONST               0 (-1)
                 43 LOAD_CONST               1 (None)
                 46 IMPORT_NAME              4 (mod.d)
                 49 LOAD_ATTR                5 (d)
                 52 STORE_NAME               5 (d)
                 55 LOAD_CONST               1 (None)
    

    In the end they look the same (STORE_NAME is result in each example), but this is worth noting if you need to consider the following four circular imports:

    example1

    foo/
       __init__.py
       a.py
       b.py
    
    a.py:
    import foo.b 
    
    b.py:
    import foo.a
    
    >>> import foo.a
    >>>
    

    This works

    example2

    bar/
       __init__.py
       a.py
       b.py
    
    a.py:
    import bar.b as b
    
    b.py:
    import bar.a as a
    
    >>> import bar.a
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "bar\a.py", line 1, in <module>
        import bar.b as b
      File "bar\b.py", line 1, in <module>
        import bar.a as a
    AttributeError: 'module' object has no attribute 'a'
    

    No dice

    example3

    baz/
       __init__.py
       a.py
       b.py
    
    a.py:
    from baz import b
    
    b.py:
    from baz import a
    
    >>> import baz.a
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "baz\a.py", line 1, in <module>
        from baz import b
      File "baz\b.py", line 1, in <module>
        from baz import a
    ImportError: cannot import name a
    

    Similar issue... but clearly from x import y is not the same as import import x.y as y

    example4

    qux/
       __init__.py
       a.py
       b.py
    
    a.py:
    import b 
    
    b.py:
    import a
    
    >>> import qux.a
    >>>
    

    This one also works

    0 讨论(0)
  • 2020-11-21 08:05

    since many people answered here but i am just trying my best :)

    1. import module is best when you don't know which item you have to import from module. In this way it may be difficult to debug when problem raises because you don't know which item have problem.

    2. form module import <foo> is best when you know which item you require to import and also helpful in more controlling using importing specific item according to your need. Using this way debugging may be easy because you know which item you imported.

    0 讨论(0)
  • 2020-11-21 08:06

    I've just discovered one more subtle difference between these two methods.

    If module foo uses a following import:

    from itertools import count
    

    Then module bar can by mistake use count as though it was defined in foo, not in itertools:

    import foo
    foo.count()
    

    If foo uses:

    import itertools
    

    the mistake is still possible, but less likely to be made. bar needs to:

    import foo
    foo.itertools.count()
    

    This caused some troubles to me. I had a module that by mistake imported an exception from a module that did not define it, only imported it from other module (using from module import SomeException). When the import was no longer needed and removed, the offending module was broken.

    0 讨论(0)
  • 2020-11-21 08:07
    import package
    import module
    

    With import, the token must be a module (a file containing Python commands) or a package (a folder in the sys.path containing a file __init__.py.)

    When there are subpackages:

    import package1.package2.package
    import package1.package2.module
    

    the requirements for folder (package) or file (module) are the same, but the folder or file must be inside package2 which must be inside package1, and both package1 and package2 must contain __init__.py files. https://docs.python.org/2/tutorial/modules.html

    With the from style of import:

    from package1.package2 import package
    from package1.package2 import module
    

    the package or module enters the namespace of the file containing the import statement as module (or package) instead of package1.package2.module. You can always bind to a more convenient name:

    a = big_package_name.subpackage.even_longer_subpackage_name.function
    

    Only the from style of import permits you to name a particular function or variable:

    from package3.module import some_function
    

    is allowed, but

    import package3.module.some_function 
    

    is not allowed.

    0 讨论(0)
提交回复
热议问题