2017-07-11 41 views
1

python的谷歌样式指南指出,应该: “仅对包和模块使用导入。”要求python导入为模块

https://google.github.io/styleguide/pyguide.html#Imports

是否有一个工具,它的标志违反本建议的?

Pylint不这样做。例如,以下内容: Is there a tool to lint Python based on the Google style guide?

创建test.py的违反准则(exists是一个函数,而不是一个模块):

"""Test file for pylint""" 
from os.path import exists 

exists('/home') 

然后,运行pylint的与RC文件不就好了:

$ pylint --rcfile=googlecl-pylint.rc -r n -s n test.py 
$ echo $? 
0 

通过可能的代码搜索:http://pylint-messages.wikidot.com/all-codes,我没有看到任何看起来像它会发出警告反对这一点。

我也没有看到pep8或pyflakes中的任何东西可以捕捉到这一点。

+3

谁做对Python编程惯例谷歌的权威?你应该坚持[PEP准则](https://www.python.org/dev/peps/pep-0008/#imports),这就是最新的。 –

+0

我也在寻找这个。任何运气,@jobevers? – Mitar

+0

@mitar:还没有。 – jobevers

回答

1

我给这个目的以下pylint的插件:

import astroid 
from pylint import checkers, interfaces 
from pylint.checkers import utils 


class ImportOnlyModulesChecked(checkers.BaseChecker): 
    __implements__ = interfaces.IAstroidChecker 

    name = 'import-only-modules' 
    priority = -1 
    msgs = { 
    'W5521': (
     "Import \"%s\" from \"%s\" is not a module.", 
     'import-only-modules', 
     "Only modules should be imported.", 
    ), 
    } 

    @utils.check_messages('import-only-modules') 
    def visit_importfrom(self, node): 
    try: 
     imported_module = node.do_import_module(node.modname) 
    except astroid.AstroidBuildingException: 
     # Import errors should be checked elsewhere. 
     return 

    if node.level is None: 
     modname = node.modname 
    else: 
     modname = '.' * node.level + node.modname 

    for (name, alias) in node.names: 
     # Wildcard imports should be checked elsewhere. 
     if name == '*': 
     continue 

     try: 
     imported_module.import_module(name, True) 
     # Good, we could import "name" as a module relative to the "imported_module". 
     except astroid.AstroidImportError: 
     self.add_message(
      'import-only-modules', 
      node=node, 
      args=(name, modname), 
     ) 
     except astroid.AstroidBuildingException: 
     # Some other error. 
     pass 


def register(linter): 
    linter.register_checker(ImportOnlyModulesChecked(linter))