【问题标题】:Importing objects into a namespace in python without redefining?将对象导入python中的命名空间而不重新定义?
【发布时间】:2012-09-13 13:59:18
【问题描述】:

我想知道是否可以将对象导入到命名空间(例如类等)中,以便可以引用它。基本上在这里删除显式的重新定义:

import Bar

class Foo:
   X = Bar.X
   Y = Bar.Y
   Z = Bar.Z

我基本上对能够从 Foo 引用 Bar.X 等感兴趣。 from ... import ... 也没有按预期工作。

【问题讨论】:

  • @esaelPsnoroMoN 简化和抽象某个 API
  • from Bar import X, Y, Z 确实可以将它们导入当前模块。您能否扩展您正在尝试做的事情?由于它们是来自 Bar(global) 的模块级定义,因此它们作为类中的实例定义没有意义。

标签: python namespaces


【解决方案1】:

我觉得你永远不需要这样做(这对我来说是个非常糟糕的主意)。但是,如果您坚持,这是我的尝试:

import module
class Foo(object):
    pass #Other stuff here

for k,v in module.__dict__.items():
    try:
       setattr(Foo,k,v)
    except AttributeError:
       pass  #read-only attributes?

当然,由您(程序员)确保您不会用module 的属性覆盖Foo 的任何属性。


请注意,如果您只想在导入时更改模块的名称,您可以这样做:

import Foo as Bar

或者你可以from import ... as name_in_this_module

例如,假设您有一个特定于 windows 的东西和一个自定义模块,它将在 Unix 上提供相同的功能:

try:
    import windows_module as sys_dep_mod
except ImportError:
    import unix_module as sys_dep_mod

def myfunc(baz):
    bar = sys_dep_mod.func(baz)
    #do something with bar
    #return something

【讨论】:

  • 感谢您的回答,它确实完成了我的要求,但我想您是对的:它不一定让最终用户清楚最终代码分析工具中可用的内容是什么也不能自动完成。
  • @stgtscc -- 你在上面说过你正在尝试简化一些 API。请参阅上面的编辑,它可能有用...
猜你喜欢
  • 2010-12-12
  • 2020-01-04
  • 2020-07-13
  • 1970-01-01
  • 2015-04-24
  • 1970-01-01
  • 2017-01-25
  • 1970-01-01
  • 2020-01-14
相关资源
最近更新 更多