小编L. *_*uce的帖子

Python >= 3.3 中命名空间包的相对位置和内容

我阅读了文档和相当多的 stackoverflow 帖子,但没有找到明确的答案来解决我的疑问。

我想我明白命名空间包的用途。

我只对 Python>=3.3 和隐式命名空间包感兴趣 - 没有__init__.py.

问题

  1. 命名空间包是否应该只包含其他包,或者模块(即.py文件)也“允许”?

  2. 命名空间包是否应该仅用作“容器”包,或者它们也可以包含在常规包中吗?

  3. 如果命名空间包只作为容器有意义,我想我可以声明,每当我有一个真正的包文件夹时,它的所有包含 python 模块的子文件夹也应该__init__.py?

# this is fine
ns_package/
+-- real_package/
   +-- __init.py__

# how about this?
real_package/
+-- __init.py__  # I have it for docs AND want to force the dir to be a real package
+-- ns_package/  # I would just like to avoid an empty __init__.py
   +-- amodule.py
Run Code Online (Sandbox Code Playgroud)

我怀疑名称空间包仅作为容器才有意义,因为在其他情况下,我将无法使用不同路径中的其他内容扩展名称空间,因为父级是一个真正的包,必须在单个点中定义文件系统。因此我不会获得命名空间包的主要优势。

语境

我问这个问题是因为在运行和导入模块(从项目的根目录)时,常规包内包含隐式名称空间包的情况工作得非常好。然而,它需要对安装的设置脚本进行一些调整,我想知道我一开始是否做了一些有缺陷的事情。

注意:我尝试使用隐式命名空间包主要不是因为我想利用它们的功能,而是因为我讨厌空 …

python python-3.x namespace-package python-packaging

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

在不指定模板参数的情况下引用非依赖名称

考虑以下:

template<typename T> struct Foo {
     typedef void                  NonDependent;
     typedef typename T::Something Dependent;
}
Run Code Online (Sandbox Code Playgroud)

我想引用NonDependent而不指定任何模板参数,如Foo::NonDependent.

我知道我总是可以使用虚拟参数:

Foo<WhateverSuits>::NonDependent bla;
Run Code Online (Sandbox Code Playgroud)

但这很难看,而且由于它NonDependent是不变的T,我想在不依赖假人的情况下参考它.可能吗?

谢谢

c++ templates dependent-name

2
推荐指数
1
解决办法
47
查看次数

编译时选择特定方法,伪装成操作符

我有一堂这样的课:

struct Base
{
    void aa(int n) const {
        std::cout << "aa() " << field*n << std::endl;
    }

    void bb(int n) const {
        std::cout << "bb() " << field*n*2 << std::endl;
    }

    int field = 2;
};
Run Code Online (Sandbox Code Playgroud)

我希望能够在编译时选择两个实现之一,aa()或者bb(),通过调用操作符方法。就像是:

Base data;
Magic obj(data);
obj.as_AA() * 33; // should call data.aa(33)
obj.as_BB() * 44; // should call data.bb(44)
Run Code Online (Sandbox Code Playgroud)

data不得重复。并且aa()vs的选择bb()必须在编译时解决。

我有一个使用向下转换的解决方案,其行为理论上未定义(我认为)。它构建(使用 g++ 和 clang++)并完美运行,但仍然......

struct AA : public Base
{
    void operator*(int …
Run Code Online (Sandbox Code Playgroud)

c++ templates operator-overloading downcast

0
推荐指数
1
解决办法
40
查看次数