astriod 包中的 Pylint 无限递归

Nik*_*lub 8 python pylint celery

我有以下代码片段,pylint 无法处理:

from celery import Celery


def create_celery(application):
    """
    Configures celery instance from application, using it's config
    :param application: Flask application instance
    :return: Celery instance
    """
    celery = Celery(application.import_name)
    celery.conf.update(application.config)
    TaskBase = celery.Task

    class ContextTask(TaskBase):
        abstract = True

        def __call__(self, *args, **kwargs):
            with application.app_context():
                return TaskBase.__call__(self, *args, **kwargs)

    celery.Task = ContextTask
    return celery
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

 File "/usr/local/lib/python3.4/dist-packages/astroid/context.py", line 49, in cache_generator
    for result in generator:
  File "/usr/local/lib/python3.4/dist-packages/astroid/bases.py", line 302, in wrapped
    for res in _func(node, context, **kwargs):
  File "/usr/local/lib/python3.4/dist-packages/astroid/bases.py", line 325, in raise_if_nothing_inferred
    for node in func(*args, **kwargs):
  File "/usr/local/lib/python3.4/dist-packages/astroid/inference.py", line 156, in infer_attribute
    for owner in self.expr.infer(context):
  File "/usr/local/lib/python3.4/dist-packages/astroid/context.py", line 49, in cache_generator
    for result in generator:
  File "/usr/local/lib/python3.4/dist-packages/astroid/bases.py", line 302, in wrapped
    for res in _func(node, context, **kwargs):
  File "/usr/local/lib/python3.4/dist-packages/astroid/bases.py", line 99, in _infer_stmts
    for inferred in stmt.infer(context=context):
  File "/usr/local/lib/python3.4/dist-packages/astroid/context.py", line 49, in cache_generator
    for result in generator:
  File "/usr/local/lib/python3.4/dist-packages/astroid/bases.py", line 302, in wrapped
    for res in _func(node, context, **kwargs):
  File "/usr/local/lib/python3.4/dist-packages/astroid/bases.py", line 99, in _infer_stmts
    for inferred in stmt.infer(context=context):
  File "/usr/local/lib/python3.4/dist-packages/astroid/context.py", line 49, in cache_generator
    for result in generator:
  File "/usr/local/lib/python3.4/dist-packages/astroid/bases.py", line 302, in wrapped
    for res in _func(node, context, **kwargs):
  File "/usr/local/lib/python3.4/dist-packages/astroid/bases.py", line 325, in raise_if_nothing_inferred
    for node in func(*args, **kwargs):
  File "/usr/local/lib/python3.4/dist-packages/astroid/inference.py", line 100, in infer_call
    for callee in self.func.infer(context):
  File "/usr/local/lib/python3.4/dist-packages/astroid/context.py", line 49, in cache_generator
    for result in generator:
  File "/usr/local/lib/python3.4/dist-packages/astroid/bases.py", line 302, in wrapped
    for res in _func(node, context, **kwargs):
  File "/usr/local/lib/python3.4/dist-packages/astroid/bases.py", line 99, in _infer_stmts
    for inferred in stmt.infer(context=context):
  File "/usr/local/lib/python3.4/dist-packages/astroid/context.py", line 49, in cache_generator
    for result in generator:
  File "/usr/local/lib/python3.4/dist-packages/astroid/bases.py", line 302, in wrapped
    for res in _func(node, context, **kwargs):
  File "/usr/local/lib/python3.4/dist-packages/astroid/bases.py", line 99, in _infer_stmts
    for inferred in stmt.infer(context=context):
  File "/usr/local/lib/python3.4/dist-packages/astroid/context.py", line 49, in cache_generator
    for result in generator:
  File "/usr/local/lib/python3.4/dist-packages/astroid/bases.py", line 302, in wrapped
    for res in _func(node, context, **kwargs):
  File "/usr/local/lib/python3.4/dist-packages/astroid/inference.py", line 144, in infer_import_from
    context = contextmod.copy_context(context)
  File "/usr/local/lib/python3.4/dist-packages/astroid/context.py", line 79, in copy_context
    return context.clone()
  File "/usr/local/lib/python3.4/dist-packages/astroid/context.py", line 42, in clone
    clone = InferenceContext(self.path, inferred=self.inferred)
RuntimeError: maximum recursion depth exceeded
Run Code Online (Sandbox Code Playgroud)

我使用最新的 pylint 1.5.5 和 python 3.4

我试图联系 logilab 上的问题跟踪器,但他们的登录功能似乎已损坏。

我找到了一个解决方法,对该文件使用 --ignore 选项,但它不能解决问题

dem*_*hog 8

我在我的项目中有这个,我花了很长时间在 astroid 中寻找问题。事实证明(对我而言)pylint 只是深度递归,并且增加堆栈大小可以解决问题。所以我在 pylint 调用之前添加了以下内容(我从单元测试代码调用 pylint)。

# If we don't do this we get stack overflows running pylint!!
# It's parsing and tests are deeply recursive.
import sys
sys.setrecursionlimit(8 * sys.getrecursionlimit())
Run Code Online (Sandbox Code Playgroud)

我已被告知您可以将其添加到 pylintrc 中(未测试)。

init-hook='import sys; sys.setrecursionlimit(8 * sys.getrecursionlimit())'
Run Code Online (Sandbox Code Playgroud)

  • 我不确定什么是最糟糕的,这个解决方案,或者我正在使用它的事实...... (5认同)