使用with语句基本上有三种方法:
使用现有的上下文管理器:
with manager:
pass
Run Code Online (Sandbox Code Playgroud)
创建上下文管理器并将其结果绑定到变量:
with Manager() as result:
pass
Run Code Online (Sandbox Code Playgroud)
创建上下文管理器并丢弃其返回值:
with Manager():
pass
Run Code Online (Sandbox Code Playgroud)
如果我们get_manager()在上面的三个块中放置了一个函数,是否有任何实现可以返回封闭的上下文管理器,或者至少它们的__exit__函数?
在第一种情况下,这显然很容易,但我想不出能让它在另外两种情况下工作的方法.我怀疑是否可以获得整个上下文管理器,因为值堆栈会在SETUP_WITH操作码之后立即弹出.但是,由于__exit__函数存储在块堆栈中SETUP_WITH,是否有某种方法可以访问它?
Automake要求我的项目的源目录中存在以下"标准"文件:
显然,这些文件都不是构建程序所必需的,但Automake拒绝在没有它们的情况下运行.我知道--add-missing将生成样板文件的标志,但我宁愿根本没有文件.
有没有办法强制Automake运行并忽略丢失的文件而不生成它们?
首先我要说的是,我了解槽和元类在 Python 中的工作原理。在处理这两个问题时,我遇到了一个有趣的问题。这是一个最小的例子:
def decorator(cls):
dct = dict(cls.__dict__)
dct['__slots__'] = ('y',)
return type('NewClass', cls.__bases__, dct)
@decorator
class A(object):
__slots__= ('x',)
def __init__(self):
self.x = 'xx'
A()
Run Code Online (Sandbox Code Playgroud)
这会产生以下异常:
Traceback (most recent call last):
File "p.py", line 12, in <module>
A()
File "p.py", line 10, in __init__
self.x = 'xx'
TypeError: descriptor 'x' for 'A' objects doesn't apply to 'NewClass' object
Run Code Online (Sandbox Code Playgroud)
现在,我知道为什么会发生这种情况:为槽创建的描述符x必须能够引用槽的保留空间。只有类 A 的实例或 A 的子类的实例才有此保留空间,因此只有这些实例可以使用描述符x。在上面的示例中,元类创建了一个新类型,它是 A 基类的子类,但不是 A 本身的子类,因此我们得到了异常。够简单的。
当然,在这个简单的示例中,以下两个定义之一都decorator可以解决该问题:
def decorator(cls):
dct = dict(cls.__dict__) …Run Code Online (Sandbox Code Playgroud)