【问题标题】:Namespaces in Python vs C++Python 与 C++ 中的命名空间
【发布时间】:2015-06-26 03:59:16
【问题描述】:

Python 中与 C++ 中的 namespaceusing 语句最接近的概念是什么?

【问题讨论】:

  • Python 也有命名空间,我认为with 上下文管理器与using 大致相似。
  • 我不太懂 C++,但是 C++ 中的 using 不像 Python 中的 import 吗?
  • @KSFT 不是。 C++ 没有模块,因此它不等同于 python import

标签: python c++ namespaces using


【解决方案1】:

与其他语言中的namespace 指令最接近的是PEP 420 中描述并在Python 3.3 中引入的隐式命名空间包工具。它允许将多个位置的模块组合到一个统一的命名空间中,而不是强制导入在 sys.path 中找到的第一个有效候选者。

没有直接等同于using;从模块中导入特定名称会单方面将它们添加到本地范围。

【讨论】:

    【解决方案2】:

    没有真正的类比。考虑这个简单的标题:

    // a.h
    namespace ns {
        struct A { .. };
        struct B { .. };
    }
    

    如果我们这样做:

    #include "a.h"
    using ns::A;
    

    该代码的重点是能够编写不合格的A(而不是必须编写ns::A)。现在,您可以考虑将 python 等效为:

    from a import A
    

    但不管using如何,整个 a.h 标头仍将被包含和编译,因此我们仍然可以编写ns::B,而在Python版本中,@ 987654329@ 将不可见。

    更广泛的版本:

    using namespace ns;
    

    当然也没有 Python 类似物,因为这会在整个代码库中引入来自 namespace nsall 名称 - 并且可以重用命名空间。我看到初学者 C++ 程序员做的最常见的事情是:

    #include <vector>
    #include <map>
    #include <algorithm>
    
    using namespace std; // bring in EVERYTHING
    

    那一行是一种相当于:

    from vector import *
    from map import *
    from algorithm import *
    

    至少在它的作用上,但它实际上只引入了 namespace std 中的内容 - 这并不是必要一切。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-09
      • 2010-11-21
      相关资源
      最近更新 更多