Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cyclic Imports to fix R0401 from pylint

Pylint complains about cyclic import with R0401 error code for a specific file of the NLTK package, e.g.

nltk/nltk/ccg/lexicon.py:1: [R0401(cyclic-import), ] Cyclic import (nltk -> nltk.internals)
nltk/nltk/ccg/lexicon.py:1: [R0401(cyclic-import), ] Cyclic import (nltk.corpus -> nltk.tokenize -> nltk.tokenize.punkt -> nltk.probability)
nltk/nltk/ccg/lexicon.py:1: [R0401(cyclic-import), ] Cyclic import (nltk.corpus -> nltk.tokenize -> nltk.tokenize.texttiling)
nltk/nltk/ccg/lexicon.py:1: [R0401(cyclic-import), ] Cyclic import (nltk.draw.tree -> nltk.tree)
nltk/nltk/ccg/lexicon.py:1: [R0401(cyclic-import), ] Cyclic import (nltk.tree -> nltk.treeprettyprinter)
nltk/nltk/ccg/lexicon.py:1: [R0401(cyclic-import), ] Cyclic import (nltk.grammar -> nltk.parse.pchart)
nltk/nltk/ccg/lexicon.py:1: [R0401(cyclic-import), ] Cyclic import (nltk.stem -> nltk.stem.porter)
nltk/nltk/ccg/lexicon.py:1: [R0401(cyclic-import), ] Cyclic import (nltk.classify.maxent -> nltk.classify.tadm)

The full list is on https://github.com/nltk/nltk/issues/2113

But looking at the imports:

from __future__ import unicode_literals from 

import re
from collections import defaultdict

from nltk.ccg.api import PrimitiveCategory, Direction, CCGVar, FunctionalCategory
from nltk.compat import python_2_unicode_compatible
from nltk.internals import deprecated

from nltk.sem.logic import *

But look at the nltk.internals https://github.com/nltk/nltk/blob/develop/nltk/internals.py , there isn't any cyclic imports that points to nltk.ccg.lexicon:

from __future__ import print_function

import subprocess
import os
import fnmatch
import re
import warnings
import textwrap
import types
import sys
import stat
import locale

# Use the c version of ElementTree, which is faster, if possible:
try:
    from xml.etree import cElementTree as ElementTree
except ImportError:
    from xml.etree import ElementTree

from six import string_types

from nltk import __file__
from nltk import compat

What does the R0401(cyclic-import) message mean?

Looking at the nltk.ccg.lexicon.py and nltk.internals.py There isn't any imports that's cyclic, so how could the problem be resolved.

like image 484
alvas Avatar asked Sep 12 '18 06:09

alvas


People also ask

What are cyclic imports in Python?

Cyclic imports often appear when the design contains complex dependency. This article describe the cases it emerges and the way to fix it. Skip to primary navigation Skip to content Skip to footer A blog of a mathematician, c., and f. Posts Categories Tags IP About Toggle searchToggle menu Cyclic imports in Python: How to handle it?

What is Python circular import problem?

But many times unknowingly, we can run into python circular import problems if we accidentally have another file named as module’s name. As python prefers importing from the local current directory first and then from site-packages, it will create a circular import problem.

Why does my circular import fail?

Only if there is a logical circular dependency, this will fail. Most Circular Imports are not actually logical circular imports but rather raise ImportError errors, because of the way import () evaluates top level statements of the entire file when called. These ImportErrors can almost always be avoided if you positively want your imports on top:


1 Answers

Not sure why pylint reports these in the nltk/nltk/ccg/lexicon.py file, but the cyclic imports themselves can be seen on the right in the error message.

Taking the first error: Cyclic import (nltk -> nltk.internals): the root __init__.py has an import from nltk.internals, and internals.py has an import from the package root, which is obviously a cyclic import.

like image 74
Mikhail Burshteyn Avatar answered Oct 26 '22 00:10

Mikhail Burshteyn