私がたどり着いた唯一の解決策は、インポート フックに関するものでした。これは私がやりたいと思っていたことを少し超えていますが、それらがどのように機能するかを学ぶための良い口実だと感じました.
このソリューションは、「一貫性のない空白」をチェックせず、タブをチェックするだけですが、簡単に拡張できます。
結果は次のとおりです。
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"