什么是Python等效于C ++命名空间?

时间:2017-03-13 21:40:03

标签: python python-3.x

在C ++中我会写:

namespace LowerLevel{
int DoStuff() {}; //
}

通过以下方式访问:

LowerLevel::DoStuff()

我如何在Python中完成这两项工作?

3 个答案:

答案 0 :(得分:5)

精神上最接近的是使用模块。

在文件lower_level.py中,您有

def do_stuff():
  pass

然后在其他地方做:

import lower_level
lower_level.do_stuff()

EDIT / addendums:这是一种简单的方法。像包这样的东西,你有一个文件夹lower_level,在那个文件夹里面是一个__init__.py标识lower_level作为一个包。在该软件包中,您有.py个文件作为模块,或者您将某些导入和声明放入__init__.py。但它也可以保持空洞。我猜包会相当于嵌套的命名空间。

- prog.py
\MyNameSpaceA
    - __init__.py # just an empty file
    - ObjA.py # A python Module
    \SubPackageB
       - __init__.py
       - ObjB.py # another python module

答案 1 :(得分:1)

另一种选择是在函数中定义所有内容并返回本地。优点是所有定义都在同一范围内,因此它们可以互相引用而没有任何前缀。同样,您可以在同一文件中拥有许多这些文件。

import argparse

def InitLowerLevel():
    def DoStuff():
        return 1
    def DoOtherStuff():
        return DoStuff()
    kFoo = 0
    return argparse.Namespace(**locals())

lower_level = InitLowerLevel()

lower_level.DoStuff()

答案 2 :(得分:0)

GetRealObject模块也可以考虑使用,具体取决于您的用例。最初的答案就是我所说的更好的软件开发最佳实践,但是此模块提供了您最初要求的功能。

它允许点表示法设置和获取变量。但是,当您尝试添加新的变量/函数时,抱怨不如命令。

Python 3

IPAddress

尽管可以在documentation处找到使用argparse的正确方法 ,可以在此StackOverflow question上找到更多示例(如果您通过示例更好地理解,会有所帮助!)