
Inline adoc files when they are included exactly once. Also fix language tags because this inlining gives us better information on what language the code is written in.
96 lines
2.8 KiB
Plaintext
96 lines
2.8 KiB
Plaintext
== Why is this an issue?
|
|
|
|
Importing every public name from a module using a wildcard (``++from mymodule import *++``) is a bad idea because:
|
|
|
|
* It could lead to conflicts between names defined locally and the ones imported.
|
|
* It reduces code readability as developers will have a hard time knowing where names come from.
|
|
* It clutters the local namespace, which makes debugging more difficult.
|
|
|
|
Remember that imported names can change when you update your dependencies. A wildcard import which works today might be broken tomorrow.
|
|
|
|
|
|
There are two ways to avoid a wildcard import:
|
|
|
|
* Replace it with ``++import mymodule++`` and access module members as ``++mymodule.myfunction++``. If the module name is too long, alias it to a shorter name. Example: ``++import pandas as pd++``
|
|
* List every imported name. If necessary import statements can be split on multiple lines using parentheses (preferred solution) or backslashes.
|
|
|
|
=== Noncompliant code example
|
|
|
|
[source,python]
|
|
----
|
|
from math import * # Noncompliant
|
|
def exp(x):
|
|
pass
|
|
print(exp(0)) # "None" will be printed
|
|
----
|
|
|
|
=== Compliant solution
|
|
|
|
[source,python]
|
|
----
|
|
import math
|
|
def exp(x):
|
|
pass
|
|
print(math.exp(0)) # "1.0" will be printed
|
|
----
|
|
Or
|
|
|
|
[source,python]
|
|
----
|
|
from math import exp as m_exp
|
|
def exp(x):
|
|
pass
|
|
print(m_exp(0)) # "1.0" will be printed
|
|
----
|
|
|
|
=== Exceptions
|
|
|
|
No issue will be raised in ``++__init__.py++`` files. Wildcard imports are a common way of populating these modules.
|
|
|
|
No issue will be raised in modules doing only imports. Local modules are sometimes created as a proxy for third-party modules.
|
|
|
|
[source,python]
|
|
----
|
|
# file: mylibrary/pyplot.py
|
|
try:
|
|
from guiqwt.pyplot import * # Ok
|
|
except Exception:
|
|
from matplotlib.pyplot import * # Ok
|
|
----
|
|
|
|
Just keep in mind that wildcard imports might still create issues in these cases. It's always better to import only what you need.
|
|
|
|
== Resources
|
|
|
|
* https://docs.python.org/3.8/reference/simple_stmts.html#import[Python documentation - The import statement]
|
|
|
|
ifdef::env-github,rspecator-view[]
|
|
|
|
'''
|
|
== Implementation Specification
|
|
(visible only on this page)
|
|
|
|
=== Message
|
|
|
|
Import only needed names or import the module and then use its members.
|
|
|
|
|
|
=== Highlighting
|
|
|
|
* Primary: the whole import statement
|
|
|
|
|
|
'''
|
|
== Comments And Links
|
|
(visible only on this page)
|
|
|
|
=== on 23 Apr 2015, 09:36:39 Ann Campbell wrote:
|
|
\[~elena.vilchik] the docs.quantifiedcode.com link was 404. Would you supply the code samples, please?
|
|
|
|
=== on 23 Apr 2015, 10:16:47 Elena Vilchik wrote:
|
|
\[~ann.campbell.2] \http://webcache.googleusercontent.com/search?q=cache:JOuoj37QmGUJ:docs.quantifiedcode.com/python-code-patterns/maintainability/wildcard_import.html+&cd=3&hl=ru&ct=clnk&gl=fr here is saved copy. I don't know what happened :(
|
|
|
|
include::../comments-and-links.adoc[]
|
|
|
|
endif::env-github,rspecator-view[]
|