Есть ли способ либо:

  • Всегда включайте -t по умолчанию (предупреждайте о непоследовательном использовании вкладок)
  • Уметь включать его программно при запуске (например, в модуле sitecustomize.py)

Это также должно работать для встроенного Python (поэтому псевдонимы python или аналогичные решения будут бесполезны). Использование sitecustomize.py позволяет нам подключаться к встроенным экземплярам Python, так что это кажется хорошим местом для этого.

Я думал, что модуль warnings предоставит способ включить это предупреждение, но я ничего не вижу.

Для справки:

usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
...
-t     : issue warnings about inconsistent tab usage (-tt: issue errors)
...

Любые предложения о том, как это можно сделать?

Спасибо.

2
quornian 22 Янв 2013 в 20:08

2 ответа

Лучший ответ

Единственное решение, к которому я смог прийти, включает в себя импортные хуки. Хотя это и выходит за рамки того, что я надеялся сделать, я почувствовал, что для меня это хороший повод узнать, как они работают.

Это решение не проверяет наличие «непоследовательных пробелов», оно просто проверяет наличие вкладок, но его было бы легко расширить.

Вот результат:

import sys
import imp
import warnings


class TabCheckImporter(object):

    """Finder and loader class for checking for the presence of tabs

    """

    def find_module(self, fullname, path=None):
        """Module finding method

        """
        # Save the path so we know where to look in load_module
        self.path = path
        return self

    def load_module(self, name):
        """Module loading method.

        """
        # Check if it was already imported
        module = sys.modules.get(name)
        if module is not None:
            return module

        # Find the module and check for tabs
        file_, pathname, description = imp.find_module(name, self.path)
        try:
            content = file_.read()
            tab = content.find("\t")
            if tab > -1:
                lineno = content[:tab].count("\n") + 1
                warnings.warn_explicit(
                        "module '{0}' contains a tab character".format(name),
                        ImportWarning,
                        pathname,
                        lineno)
        except Exception as e:
            warnings.warn("Module '{0}' could not be checked".format(name),
                          ImportWarning)

        # Import the module
        try:
            module = imp.load_module(name, file_, pathname, description)
        finally:
            if file_:
                file_.close()

        sys.modules[name] = module
        return module


# Register the hook
sys.meta_path = (sys.meta_path or []) + [TabCheckImporter()]

# Enable ImportWarnings
warnings.simplefilter("always", ImportWarning)

Импортируем этот файл (заменив ->| на буквенную вкладку):

# File: test_tabbed.py
if True:
->| print "This line starts with a tab"

Дает этот вывод:

$ python -c 'import hook; import test_normal; import test_tabbed;'
test_tabbed.py:3: ImportWarning: module 'test_tabbed' contains a tab character
  print "This line starts with a tab"
0
quornian 3 Фев 2013 в 03:03

Там нет такой опции.

Вы также можете

  • обернуть вызов интерпретатора внутри скрипта bash
  • определить псевдоним
0
Andreas Jung 22 Янв 2013 в 16:13