小编pos*_*aki的帖子

Python 类的 `__mro__` 属性从何而来?

假设有一些类:

class Test():
    pass 
Run Code Online (Sandbox Code Playgroud)

(1)在 SO 和文档中的某处,我接下来阅读:

mro()在类实例化时调用,其结果存储在__mro__.

好的,这对我来说仍然很清楚,因为__mro__确实存储了一些东西:

Test.__mro__                                                         
Out[48]: (__main__.Test, object)
Run Code Online (Sandbox Code Playgroud)

再一次,我在某处读到了这个:

要查找属性名称 Python 搜索:
a) 搜索在 C 处找到__dict__的所有元类__mro____class__
b) 如果在步骤 a 中找到数据描述符,则调用它__get__() 并退出。
c) 否则,__dict__ 在 C 自己的类的 中调用描述符或返回值__mro__
d) 调用在步骤 a 中找到的非数据描述符。
e)否则,返回元类树值

我可以发现没有__mro__in Test.__dict__

'__mro__' in Test.__dict__                                           
Out[49]: False
Run Code Online (Sandbox Code Playgroud)

因此,根据e之前引用的条款,我想这 __mro__应该取自“元类树值”,因此取自type.__dict__

真的,还有__mro__type.__dict__

["mro:<method 'mro' …
Run Code Online (Sandbox Code Playgroud)

python python-3.x

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

如何将 vm.SourceTextModule 创建的模块的导入依赖项链接到它?

假设我们正在创建一个app通过构造新vm.SourceTextModule对象来调用的模块:

const context = {
  exports: {},
  console,  // custom console object
};
const sandbox = vm.createContext(context);

const app = new vm.SourceTextModule(
  `import path from 'path';
   console.log(path.resolve('./src'));`,
  {
    context: sandbox,
  }
);
Run Code Online (Sandbox Code Playgroud)

根据Node.js 文档,要从模块获取默认导出,path我们应该将模块导入的依赖项“链接”app到它。
为了实现这一点,我们应该将linker回调传递给app.link方法:

async function linker(specifier, referencingModule) {
    // the desired logic...
}

await app.link(linker);
Run Code Online (Sandbox Code Playgroud)

如何linker正确实现功能,以便我们可以path在新创建的模块中导入模块app并使用它:

await app.evaluate();  // => /home/user/Documents/project/src
Run Code Online (Sandbox Code Playgroud)

PS 我们正在使用TypeScript,所以我检查了我们是否安装了path包的类型。

包.json …

javascript node.js node-vm2

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

标签 统计

javascript ×1

node-vm2 ×1

node.js ×1

python ×1

python-3.x ×1