小编Nar*_*lei的帖子

是否可以访问封闭的上下文管理器?

使用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,是否有某种方法可以访问它?

python contextmanager

15
推荐指数
2
解决办法
3072
查看次数

Automake忽略了丢失的NEWS/AUTHORS/COPYING/etc. 标准文件

Automake要求我的项目的源目录中存在以下"标准"文件:

  • 安装
  • 新闻
  • 自述
  • 复印
  • 作者
  • 更新日志

显然,这些文件都不是构建程序所必需的,但Automake拒绝在没有它们的情况下运行.我知道--add-missing将生成样板文件的标志,但我宁愿根本没有文件.

有没有办法强制Automake运行并忽略丢失的文件而不生成它们?

automake autotools

6
推荐指数
1
解决办法
1916
查看次数

是否可以在已经定义 __slots__ 的类的装饰器中添加 __slots__ ?

首先我要说的是,我了解槽和元类在 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)

python metaclass slots

3
推荐指数
1
解决办法
1497
查看次数

标签 统计

python ×2

automake ×1

autotools ×1

contextmanager ×1

metaclass ×1

slots ×1