How to force Python to โ€œimportโ€ to process the name as a module, not a function?

I am using SymPy and am facing the following problem:

>>> import sympy.utilities.lambdify
>>> sympy.utilities.lambdify
<function lambdify at 0x0000000003802B38>

Wait, shouldn't it sympy.utilities.lambdifybe a module?

>>> from sympy.utilities.lambdify import implemented_function
>>> implemented_function
<function implemented_function at 0x0000000003802CF8>
>>> implemented_function.__module__
'sympy.utilities.lambdify'

Oh, so there is a name conflict.

Now, obviously, I can just use it implemented_function, but that is not my question.

My question is: how can I import a sympy.utilities.lambdify module , not a function?

(I just used SymPy to illustrate here. Regardless of whether this is the correct use of the library next to the source code. Source is here .)

+4
source share
3 answers

, , importlib:

import importlib
lamdify = importlib.import_module('sympy.utilities.lambdify')
print lambdify
  <module 'sympy.utilities.lambdify' from 'c:\python-2.7.8-amd64\lib\site-packages\sympy\utilities\lambdify.pyc'>

( @Mehrdad):

, , :

def import_module(lambda_): 
    import importlib; 
    return importlib.import_module('.'.join(lambda_.__code__.co_names)) 

: lambdify = import_module(lambda: sympy.utilities.lambdify)

.

+4

, lambdify , python, . bar.py:

def foo(): pass

def bar(): pass

from bar import bar; print(bar.__module__) 'bar'.

lambdify , __init__ sympy.utilities:

from .lambdify import lambdify

lambdify.py sympy.utilities lambdify(), sympy.utilities. , sympy.utilities, lambdify. import , lambdify.py from sympy.utilities.lambdify import ....


, . , , , , . bar.py , __init__py:

from .bar import bar

tmp, tmp "" bar ( , __init__.py). , tmp.bar, sympy:

>>> import tmp
>>> tmp
<module 'tmp' from '/home/user/python/tmp/__init__.py'>
>>> import tmp.bar
>>> tmp.bar
<function bar at 0x7f24426461e0>
>>> tmp.bar.foo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'function' object has no attribute 'foo'
>>> from tmp.bar import foo
>>> foo
<function foo at 0x7f2442646158>

, tmp.bar , . . , , !

, sys.modules:

>>> import sys
>>> 'tmp' in sys.modules
False
>>> import tmp.bar
>>> tmp.bar
<function bar at 0x7fc833025158>
>>> 'tmp.bar' in sys.modules
True
>>> tmp.bar.foo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'function' object has no attribute 'foo'
>>> sys.modules['tmp.bar'].foo
<function foo at 0x7fc833020f28>

, tmp.bar , sys.modules['tmp.bar'], .

, :

>>> import sys
>>> import sympy.utilities.lambdify
>>> lambdify_module = sys.modules['sympy.utilities.lambdify']
>>> lambdify_module.implemented_function
<function implemented_function at 0x7fc83183ca60>
+2

sympy. __init__.py:

from .lambdify import lambdify

lambdify lambdify; utilities.lambdify .

Suppose you want to truly import a module, not a function lambdify. Maybe something like

import os
import imp

import sympy.utilities as mod
sub_mod_name = 'lambdify'
sub_mod_file = '{}.py'.format(sub_mod_name)

mod_loc = os.path.dirname(mod.__file__)
file_ = os.path.join(mod_loc, sub_mod_file)  # Full path for source file
sub_mod = imp.load_source(sub_mod_name, file_)  # Import module from source file

print sub_mod
# <module 'lambdify' from '/usr/local/lib/python2.7/dist-packages/sympy/utilities/lambdify.pyc'>
0
source

Source: https://habr.com/ru/post/1664120/


All Articles