相关疑难解决方法(0)

如何在当前模块上调用setattr()?

我作为第一个参数" object"传递给函数setattr(object, name, value),在当前模块上设置变量?

例如:

setattr(object, "SOME_CONSTANT", 42);
Run Code Online (Sandbox Code Playgroud)

产生同样的效果:

SOME_CONSTANT = 42
Run Code Online (Sandbox Code Playgroud)

在包含这些行的模块中(正确object).

我在模块级别动态生成多个值,而我无法__getattr__在模块级别定义,这是我的后备.

python module global-variables setattr getattr

128
推荐指数
3
解决办法
4万
查看次数

模块的属性可以与对象相同吗?

使用python属性,我可以这样做

obj.y 
Run Code Online (Sandbox Code Playgroud)

调用函数而不是仅返回值.

有没有办法用模块做到这一点?我有一个我想要的案例

module.y 
Run Code Online (Sandbox Code Playgroud)

调用函数,而不是只返回存储在那里的值.

python properties python-module

87
推荐指数
5
解决办法
2万
查看次数

可调用模块

为什么Python不允许模块有__call__?(显而易见的是,直接导入并不容易.)具体来说,为什么不使用a(b)语法找到__call__属性,就像它对函数,类和对象一样?(模块的查找是否不相同?)

>>> print(open("mod_call.py").read())
def __call__():
    return 42

>>> import mod_call
>>> mod_call()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'module' object is not callable
>>> mod_call.__call__()
42
Run Code Online (Sandbox Code Playgroud)

python module python-import

51
推荐指数
5
解决办法
1万
查看次数

用于Python的XML编写工具

我正在尝试使用ElementTree,它看起来很好,它可以逃脱HTML实体等等.我错过了一些我没听说过的真正精彩的东西吗?

这与我实际做的类似:

import xml.etree.ElementTree as ET
root = ET.Element('html')
head = ET.SubElement(root,'head')
script = ET.SubElement(head,'script')
script.set('type','text/javascript')
script.text = "var a = 'I love &aacute; letters'"
body = ET.SubElement(root,'body')
h1 = ET.SubElement(body,'h1')
h1.text = "And I like the fact that 3 > 1"
tree = ET.ElementTree(root)
tree.write('foo.xhtml')

# more foo.xhtml
<html><head><script type="text/javascript">var a = 'I love &amp;aacute;
letters'</script></head><body><h1>And I like the fact that 3 &gt; 1</h1>
</body></html>
Run Code Online (Sandbox Code Playgroud)

python xml xhtml

35
推荐指数
4
解决办法
4万
查看次数

在python解释器中挂起全局名称查找

这是事情,我有一个代理控制远程模块的引用,我把这些代理中的一些放在sys.modules这样我可以像本地模块一样使用它.但是一些其他对象放在__builtin__远程环境的模块中(就像一个魔术变量,以方便调试或引用).我不想引用这些变量conn.__builtin__.var,我必须要么替换本地__builtin__(这似乎不适用于替换sys.modules['__builtin__']或挂钩全局名称查找规则.如何?对于一个模块,你可以重载一个getattr来做这个.但是在一个交互式翻译中,如IPython谁是主要模块或如何做到这一点? 更新:正如@Nizam Mohamed指出的那样,是的,我可以得到__main__ 模块,但我仍然无法修改它的名称查找角色.

我想完全将本地环境变为远程环境(用于调试控制台)

UPDATE

现在我只是迭代所有的__builtin__.__dict__,如果有一个不在本地的名称__builtin__.我将名称添加到本地__builtin__.但是,与名称查找规则相比,它不是那么动态,如果我在本地找不到该名称,请__builtin__尝试远程名称.

是一个类似的讨论.

这个问题通过用一个对象替换它来模拟模块sys.modules.但这对于__builtin__名称查找不起作用,我也尝试__builtin__.__getattribute__用自定义的一个替换,首先使用原始查找,然后在失败时使用自定义查找.但是__builtin__从未调用过__builtin__.__getattribute__偶数的全局名称查找__builtin__.__getattribute__('name')返回所需的值,__builtin__.name或者name永远不会返回一个.

python ipython python-import rpyc

23
推荐指数
2
解决办法
1045
查看次数

为什么在赋值给sys.modules [__ name__]后__name__的值会发生变化?

在尝试做类似于Alex Martelli 的ActiveState配方标题为Python中Constants时,我遇到了意外的副作用(在Python 2.7中),它将类实例分配给sys.moduleshas中的一个条目- 即显然这样做更改__name__to 的值,None如下面的代码片段所示(它会破坏配方中的部分代码):

class _test(object): pass

import sys
print '# __name__: %r' % __name__
# __name__: '__main__'
sys.modules[__name__] = _test()
print '# __name__: %r' % __name__
# __name__: None

if __name__ == '__main__': # never executes...
    import test
    print "done"
Run Code Online (Sandbox Code Playgroud)

我想知道为什么会这样.我不相信它在Python 2.6和早期版本中是这样的,因为我有一些较旧的代码,显然if __name__ == '__main__':条件在赋值后按预期工作(但不再有).

FWIW,我也注意到这个名字在分配后也会_test从一个类对象反弹None回来.我觉得很奇怪他们正在反弹None而不是完全消失......

更新:

我想补充一点,任何实现效果的变通办法if __name__ == '__main__':都会受到高度赞赏.TIA!

python module

18
推荐指数
1
解决办法
6523
查看次数

Python中的自动加载

在过去,我使用了perl的AUTOLOAD工具来实现将符号延迟加载到命名空间中,并希望在python中使用相同的功能.

传统上,你似乎能够得到的最接近的是使用一个类和一个__getattr__类来实现这种事情.不过我也尝试过翻找sys.modules,然后想出来:

# mymod.py
def greet(greeting="Hello World"):
   print greeting

class autoload(object):
    def __init__(self, __name__):
        super(autoload, self).__init__()
        self.wrapped_name = __name__
        self.wrapped = sys.modules[__name__]
    def __getattr__(self, name):
        try:
            return getattr(self.wrapped, name)
        except AttributeError:
            def f():
                greet(name+" "+self.wrapped_name)
            return f

if __name__ != "__main__":
    import sys
    sys.modules[__name__] = autoload(__name__)
Run Code Online (Sandbox Code Playgroud)

从用户的角度来看,这确实是我喜欢的方式:

~> python
Python 2.5.1 (r251:54863, Jan 10 2008, 18:01:57)
[GCC 4.2.1 (SUSE Linux)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import mymod
>>> mymod.hello() …
Run Code Online (Sandbox Code Playgroud)

python coding-style autoload

16
推荐指数
2
解决办法
6002
查看次数

如何在Python中将全局标记为已弃用?

我已经看到装饰器允许你标记一个不推荐使用的函数,以便在使用该函数时给出警告.我想对全局变量做同样的事情,但我想不出一种检测全局变量访问的方法.我知道globals()函数,我可以检查它的内容,但这只会告诉我是否定义了全局(如果该函数被弃用并且不是全部删除它仍将是它),如果它实际上被使用的话.我能想到的最佳选择是这样的:

# myglobal = 3
myglobal = DEPRECATED(3)
Run Code Online (Sandbox Code Playgroud)

但除了如何让DEPRECATED行为与'3'完全相同的问题之外,我不确定DEPRECATED可以做什么,这样可以让你每次访问时都能检测到.我认为它能做的最好就是遍历所有全局的方法(因为Python中的所有东西都是一个对象,所以即使'3'也有方法,转换为字符串之类的东西)和'装饰'它们都被弃用了.但那并不理想.

有任何想法吗?还有其他人解决过这个问题吗?

python hook global decorator deprecated

10
推荐指数
3
解决办法
5012
查看次数

如何在boost :: python中向模块添加属性?

您可以使用getter和setter将属性添加到类中(在简单的情况下):

class<X>("X")
    .add_property("foo", &X::get_foo, &X::set_foo);
Run Code Online (Sandbox Code Playgroud)

那么你可以像这样在python中使用它:

>>> x = mymodule.X()
>>> x.foo = 'aaa'
>>> x.foo
'aaa'
Run Code Online (Sandbox Code Playgroud)

但是如何将属性添加到模块本身(而不是类)?

scope().attr("globalAttr") = ??? something ???
Run Code Online (Sandbox Code Playgroud)

def("globalAttr", ??? something ???);
Run Code Online (Sandbox Code Playgroud)

我可以使用上面两种方式添加我的类的全局函数和对象,但似乎无法像在类中一样添加属性.

c++ python boost boost-python

10
推荐指数
1
解决办法
4044
查看次数

酸洗动态创建的类型

我一直在试图获得一些动态创建的类型(即通过调用3-arg创建的类型type())来进行pickle和unpickle.我一直在使用这个模块切换技巧来隐藏模块用户的细节并给出干净的语义.

我已经学到了几件事:

  1. 必须getattr在模块本身上找到该类型
  2. 类型必须与getattr找到的一致,也就是说如果我们调用pickle.dumps(o)那么它必须是真的type(o) == getattr(module, 'name of type')

虽然我被困住了,但似乎仍有一些奇怪的事情发生 - 它似乎在呼唤__getstate__一些意想不到的东西.

这是我用最简单的设置重现问题,使用Python 3.5进行测试,但如果可能的话我想回到3.3:

# module.py
import sys
import functools

def dump(self):
    return b'Some data' # Dummy for testing

def undump(self, data):
    print('Undump: %r' % data) # Do nothing for testing

# Cheaty demo way to make this consistent
@functools.lru_cache(maxsize=None)
def make_type(name):
    return type(name, (), {
        '__getstate__': dump,
        '__setstate__': undump,
    })

class Magic(object):
    def __init__(self, path):
        self.path …
Run Code Online (Sandbox Code Playgroud)

python pickle

5
推荐指数
1
解决办法
334
查看次数