使用 __init__.py 加载动态 python 模块时出现问题

发布于 2024-11-06 07:07:44 字数 1052 浏览 4 评论 0原文

我正在尝试执行一个 __init__.py 来加载模块并实例化动态内部同名类。 这样的文件树

 importer/
     __init__.py         # The file i'm writing
     asd.py              # It contains class asd
     bsd.py              # It contains class bsd

使用像And __init__.py

importername=__name__

def load(modname,paramlist = []):

  if modname in globals():
    print 'Module %s already loaded.' % (modname)
  else:
    imported_mod = __import__(importername + '.' + modname, fromlist = ["*"])
    try:
        globals()[modname]=getattr(imported_mod,modname)(*paramlist)
    except Exception, e:
        print 'Module %s not loaded: %s.' % (modname, e)

,如果我运行

import importer
importer.load('asd')
print importer.asd.name
'ASD!'

它就像一个魅力,但如果我运行

from importer import *
load('asd')
print asd.name
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'asd' is not defined

我可以以某种方式修复它吗?谢谢。

I'm trying to do an __init__.py that load module and instantiate dinamically internal namesake class. With a file tree like

 importer/
     __init__.py         # The file i'm writing
     asd.py              # It contains class asd
     bsd.py              # It contains class bsd

And __init__.py with

importername=__name__

def load(modname,paramlist = []):

  if modname in globals():
    print 'Module %s already loaded.' % (modname)
  else:
    imported_mod = __import__(importername + '.' + modname, fromlist = ["*"])
    try:
        globals()[modname]=getattr(imported_mod,modname)(*paramlist)
    except Exception, e:
        print 'Module %s not loaded: %s.' % (modname, e)

If I run

import importer
importer.load('asd')
print importer.asd.name
'ASD!'

It works like a charm, but if I run

from importer import *
load('asd')
print asd.name
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'asd' is not defined

Can I fix it in some way? Thank you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

長街聽風 2024-11-13 07:07:44

Python 中不存在真正的全局性。当您在 importer/__init__.py 中使用 globals() 时,您正在访问模块的名称空间。您的第二个非工作示例是将“asd”添加到导入器,而不是您的测试模块。

你能做的最好的就是修改导入器,这样你就可以这样做:

from importer import *
asd = load('asd')
print asd.name

但正如托马斯·K所建议的:这有点奇怪,也许有一种更简单的方法来解决你的问题?

There is no such thing as truly global in Python. When you use globals() in importer/__init__.py, you are accessing the module's namespace. Your second non-working sample is adding 'asd' to importer, not to your test module.

The best you could is modify importer so you could do:

from importer import *
asd = load('asd')
print asd.name

But as Thomas K suggests: this is kind of odd, perhaps there's a simpler way to solve your problem?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文