【问题标题】:What is the Python equivalent to the C++ namespace?与 C++ 命名空间等效的 Python 是什么?
【发布时间】:2020-10-01 00:30:06
【问题描述】:

在 C++ 中我会写:

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

并通过以下方式访问它:

LowerLevel::DoStuff()

我如何在 Python 中做到这两点?

【问题讨论】:

  • 您有多种选择:模块、类、字典等
  • @juanpa.arrivillaga 不要忘记包裹

标签: python python-3.x


【解决方案1】:

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

在文件lower_level.py 中你会有

def do_stuff():
  pass

然后你会在其他地方做:

import lower_level
lower_level.do_stuff()

编辑/附录:这是简单的方法。像包这样的东西,你会有一个文件夹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

【讨论】:

  • 当然,该主题有很多变体,例如from lower_level import do_stuff,这会将do_stuff 放入导入模块的命名空间中。或者你做了邪恶而不推荐from lower_level import * 然后来自lower_level 的所有内容都在导入命名空间中......
  • 或者一个包(别忘了__init__.py!),它实际上只是一个包含模块的文件夹。
  • 我如何做嵌套命名空间? SpaceA::SpaceB::DoStuff()?
  • 见我的附录。包,实现为嵌套文件夹
  • @Dan 在较新版本的 Python 中,不再需要 __init__.py。
【解决方案2】:

另一种选择是在函数中定义所有内容并返回局部变量。优点是所有定义都在同一个范围内,因此它们可以在没有任何前缀的情况下相互引用。您也可以在同一个文件中包含其中的许多内容。

import argparse

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

lower_level = InitLowerLevel()

lower_level.DoStuff()

【讨论】:

  • argparse 用于将命令行参数带入程序。我看不出有任何理由将它用于其他任何事情......
  • @Tomerikoo argparse.Namespace 方便这种情况,而argparse 是标准模块,何乐而不为。有什么选择吗?
  • 是的,我想你是对的,我的意思是在构造函数中使用**kwargs 选项很方便。只是Namespace 对象非常基本,您可以使用任何其他对象,甚至是函数来做到这一点。
【解决方案3】:

argparse 模块也可能是一个可供考虑的选项,具体取决于您的用例。最初的答案是我所说的更好的软件开发最佳实践,但这个模块提供了您最初要求的功能。

它允许点符号设置和获取变量。但是当您尝试添加新变量/函数时,抱怨少于 dicts。

Python 3

>>> import argparse
>>> def my_test_function(): return
>>> ...
>>> args = argparse.Namespace()
Namespace()
>>> args.minutes  = 5
>>> args.test = my_test_function
>>> args
Namespace(minutes=5, test=<function times_close_enough at 0x000001D2BEEAA550>)

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

【讨论】:

    猜你喜欢
    • 2011-04-24
    • 1970-01-01
    • 2020-10-28
    • 2015-06-26
    • 2018-12-31
    • 2010-11-15
    • 2011-03-23
    相关资源
    最近更新 更多