Import order coding standard

后端 未结 4 1432
暗喜
暗喜 2021-01-29 21:32

PEP8 suggests that:

Imports should be grouped in the following order:

  1. standard library imports
  2. related third party imports
4条回答
  •  清歌不尽
    2021-01-29 22:07

    Update (2016): sbywater has the most recent answer.


    Found it! (accidentally, while reading "Hacker's guide to python")

    OpenStack Hacking Style Checks project named hacking introduces several unique flake8 extensions. There is hacking_import_groups among them (related commit).

    Example:

    • requirements

      • tox
      • flake8
      • hacking (from the master branch):

        $ git clone https://github.com/openstack-dev/hacking.git
        $ cd hacking/
        $ python setup.py install
        
    • files used in the example

      • tox.ini (we need to tell flake8 that we want to use a custom check)

        [hacking]
        local-check = hacking.core.hacking_import_groups
        

        UPD: with the newest version of hacking the path to the check changed, now it is hacking.checks.imports.hacking_import_groups.

      • test.py (target of the check)

        import requests
        import sys
        from my_module import print_smth
        
        
        print_smth(requests.get('https://google.com'))
        print_smth(sys.version)
        
      • my_module.py (local import used by test.py)

        def print_smth(smth):
            print smth
        

    Then, if I run flake8 against test.py:

    $ flake8 test.py
    test.py:2:1: H305  imports not grouped correctly (requests: third-party, sys: stdlib)
    test.py:3:1: H305  imports not grouped correctly (sys: stdlib, my_module.print_smth: project)
    test.py:3:1: H306  imports not in alphabetical order (sys, my_module.print_smth)
    

    Then, if I group the imports in the correct order following PEP8:

    import sys
    
    import requests
    
    from my_module import print_smth
    
    
    print_smth(requests.get('https://google.com'))
    print_smth(sys.version)
    

    No warnings found:

    $ flake8 test.py
    $
    

    Hope this will help somebody in the future.

提交回复
热议问题