小编Mar*_*ato的帖子

从类定义中的列表推导中访问类变量

如何从类定义中的列表推导中访问其他类变量?以下适用于Python 2但在Python 3中失败:

class Foo:
    x = 5
    y = [x for i in range(1)]
Run Code Online (Sandbox Code Playgroud)

Python 3.2给出了错误:

NameError: global name 'x' is not defined
Run Code Online (Sandbox Code Playgroud)

尝试Foo.x也不起作用.有关如何在Python 3中执行此操作的任何想法?

一个稍微复杂的激励示例:

from collections import namedtuple
class StateDatabase:
    State = namedtuple('State', ['name', 'capital'])
    db = [State(*args) for args in [
        ['Alabama', 'Montgomery'],
        ['Alaska', 'Juneau'],
        # ...
    ]]
Run Code Online (Sandbox Code Playgroud)

在这个例子中,apply()本来是一个不错的解决方法,但它遗憾地从Python 3中删除.

python scope list-comprehension python-3.x python-internals

152
推荐指数
3
解决办法
2万
查看次数

用于查找所有最大子集的高效算法

我有一组独特的集合(表示为位掩码),并希望消除作为另一个元素的正确子集的所有元素.例如:

input = [{1, 2, 3}, {1, 2}, {2, 3}, {2, 4}, {}]
output = [{1, 2, 3}, {2, 4}]
Run Code Online (Sandbox Code Playgroud)

我无法为此找到一个标准算法,甚至找不到这个问题的名称,所以我称其为"最大子集",因为缺少其他任何东西.这是一个O(n ^ 2)算法(在Python中具体化),假设is_subset_func是O(1):1

def eliminate_subsets(a, cardinality_func, is_subset_func):
    out = []
    for element in sorted(a, reverse=True, key=cardinality_func):
        for existing in out:
            if is_subset_func(element, existing):
                break
        else:
            out.append(element)
    return out
Run Code Online (Sandbox Code Playgroud)

是否有更高效的算法,希望是O(n log n)还是更好?


1 对于常量大小的位掩码,在我的情况下is_subset_func也是如此,它只是element & existing == element在恒定时间内运行.

algorithm set

26
推荐指数
1
解决办法
3265
查看次数

在Python 3中发布导入钩子

我想在导入特定模块时运行一些回调.例如(使用@imp.when_imported不存在的假函数):

@imp.when_imported('numpy')
def set_linewidth(numpy):
    import shutil
    numpy.set_printoptions(linewidth=shutil.get_terminal_size()[0])
Run Code Online (Sandbox Code Playgroud)

此功能是在PEP 369中设计的:后导入钩子但被撤回的原因是:

此PEP已被其作者撤回,因为在Python 3.3中迁移到importlib后,大部分详细设计不再有效.

但是importlib没有明确的解决方案.如何使用importlib实现导入后挂钩?

python python-import python-3.x

8
推荐指数
2
解决办法
653
查看次数

抑制宏观扩张

有没有办法抑制预处理器宏扩展?我有一个现有的C头文件,用于#define定义一组整数,我想将它复制到具有相同值名称的C++枚举.例如(使用C++ 11):

enum MyEnum {
  VALUE,
  // ...
};

#define VALUE 0

MyEnum convert(int x) {
  if (x == VALUE) {
    return MyEnum::VALUE;
  }
  // ...
}
Run Code Online (Sandbox Code Playgroud)

问题当然是MyEnum::VALUE被转换为MyEnum::0,这会导致语法错误.最好的解决方案是用枚举替换宏,但不幸的是,在我的情况下这不是一个选项.

我试图使用连接,但这没有帮助(编译器给出了相同的错误).

#define CONCAT(a,b) a##b
// ...
return MyEnum::CONCAT(VA,LUE);  // still results in MyEnum::0
Run Code Online (Sandbox Code Playgroud)

是否有另一种解决方案允许我为宏和枚举值具有相同的名称?

c++

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