小编Ale*_*lec的帖子

Python导入一个没有其他子包的子包

我有以下包结构

package
    __init__.py
    sub1
        __init__.py
        foo.py      # Contains class Foo
    sub2
        __init__.py
        bar.py      # Contains class Bar
Run Code Online (Sandbox Code Playgroud)

我希望能够公正import package和有package.Foopackage.Bar,即我想有子包是对用户透明.

问题是导入sub2需要很长时间,许多用户根本不关心sub2中的东西,只想要sub1中的东西.因此,我希望用户能说import package.sub1from package import sub1刚刚导入SUB1和SUB2跳跃的进口.

我知道我可以通过package/__init__.py控制来实现第一部分

from .sub1 import *
from .sub2 import *
Run Code Online (Sandbox Code Playgroud)

和具有package/sub1/__init__.pyfrom .foo import Foo与类似地对于SUB2.但是,即使用户仅尝试导入,也会始终导入sub1和sub2 package.sub1.

相应地,我可以通过package/__init__.py使用与sub1/__init__.py上面相同的空来实现第二部分.但是,然后只是说不import package加载sub1或sub2,所以用户必须显式加载它们然后引用package.sub1.Foo.

理想情况下,解决方案在2.7.10和3.5.0中均可使用,但如果两者都不可能,我将接受其中一个或另一个.

python packages python-module python-import

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

如果参数有成员变量则特殊化函数

我有一个模板化的错误报告函数,因为它可以报告许多不同消息类别的错误:

template <typename MSG>
void reportErr(const MSG& msg)
{
    std::cout << "ERROR: " << msg.error << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

然而,某些类型的消息具有可以报告的更详细的错误或其他专门的错误报告,例如

template<>
void reportErr(const SpecificMsg& msg)
{
    std::cout << "ERROR: " << msg.error;
    std::cout << ", details: " << msg.details << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

由于有很多类型SpecificMsg,例如 ,我不想为每种类型创建单独的模板专业化。是否可以为具有成员变量的任何类型创建通用特化/部分特化.details

如果可能的话,我想要一种方法来一般地执行此操作(因此,如果有.details,则一种专业化,如果有.other_info,则另一种专业化,等等)。

编辑:这是明确询问功能。我见过一些代码可以执行类似的操作来专门化模板,但我从未遇到过可以对非成员函数执行我想要的操作的代码。我怀疑将用于类的方法转换为用于函数的方法并不难,但我一直无法弄清楚如何做到这一点。

编辑 2:我的 gcc 版本(4.6.3)似乎不支持完整的 C++11 标准,因此void_t“重复”问题中提到的选项对我不起作用。我的编译器抱怨“‘类型’之前预期有嵌套名称说明符”等,甚至不让我定义 void_t。因此,我从问题中删除了 C++11 标签。

c++ gcc g++ template-specialization gcc4.6

4
推荐指数
1
解决办法
470
查看次数

一个承诺的多个等待的解决顺序

如果多个任务正在等待一个 Promise,那么一旦 Promise 得到解决,是否有一个标准顺序保证/指定这些任务将开始执行?例如,考虑以下情况

var promise = null;
function setPromiseIfNeeded() {
  if (!promise) {
    promise = new Promise(resolve => setTimeout(resolve, 100));
  }
}
client.on('event1', event => {
  setPromiseIfNeeded();
  await promise;
  console.log('event 1 done awaiting');
}
client.on('event2', event => {
  setPromiseIfNeeded();
  await promise;
  console.log('event 2 done awaiting');
}
Run Code Online (Sandbox Code Playgroud)

如果event1发生在之前event2,是否可以保证处理程序 forevent1会在处理程序 for 之前从其承诺中唤醒event2

如果行为依赖于实现,我对 Node.js v12 及更高版本的行为特别好奇。

javascript node.js promise

4
推荐指数
1
解决办法
651
查看次数