当前位置: 首页 > 面试题库 >

如何创建Python名称空间(argparse.parse_args值)?

凤衡
2023-03-14
问题内容

为了交互式测试我的python脚本,我想创建一个Namespace对象,类似于所返回的对象argparse.parse_args()。显而易见的方式

>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.parse_args()
Namespace()
>>> parser.parse_args("-a")
usage: [-h]
: error: unrecognized arguments: - a

Process Python exited abnormally with code 2

可能会导致傻子错误导致Python repl退出(如上所述)。

那么, 用给定的属性集创建Python名称空间的最简单方法是什么?

例如,我可以dict即时创建一个(dict([("a",1),("b","c")])),但不能将其用作Namespace

AttributeError: 'dict' object has no attribute 'a'

问题答案:

您可以创建一个简单的类:

class Namespace:
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)

argparse Namespace在属性方面,它的工作方式与类完全相同:

>>> args = Namespace(a=1, b='c')
>>> args.a
1
>>> args.b
'c'

或者,只需 导入类 ;可从argparse模块中获得:

from argparse import Namespace

args = Namespace(a=1, b='c')

从Python
3.3开始,还有types.SimpleNamespace,它实际上做同样的事情:

>>> from types import SimpleNamespace
>>> args = SimpleNamespace(a=1, b='c')
>>> args.a
1
>>> args.b
'c'

这两种类型是不同的。SimpleNamespace主要用于sys.implementation属性和的返回值time.get_clock_info()

进一步比较:

  • 这两个类都支持相等性测试。对于相同类的两个实例,instance_a == instance_b如果它们具有相同的属性且具有相同的值,则为true。
  • 这两个类都有助于__repr__显示它们具有哪些属性。
  • Namespace()对象支持遏制测试;'attrname' in instance如果名称空间实例具有属性namend,则为true attrnameSimpleNamespace才不是。
  • Namespace()对象具有未公开的._get_kwargs()方法,该方法返回(name, value)该实例的属性的排序列表。您可以使用任一类获得相同的结果sorted(vars(instance).items())
  • 虽然SimpleNamespace()用CNamespace()实现并用Python实现,但是属性访问并没有更快,因为它们都使用相同__dict__的属性存储。对于SimpleNamespace()实例,相等性测试和生成表示形式要快一些。


 类似资料:
  • 问题内容: 在Python中,命名空间包可让您在多个项目中传播Python代码。当您要将相关的库作为单独的下载发布时,这很有用。例如,目录和中, 最终用户可以和。 定义名称空间包的最佳方法是什么,以便多个Python产品可以在该名称空间中定义模块? 问题答案: TL; DR: 在Python 3.3上,您无需执行任何操作,只需将任何内容都不放在名称空间包目录中即可使用。在3.3之前的版本中,请选择

  • 我在一个多租户节点应用程序中工作,我知道要在Kubernetes中创建一个新的命名空间,可以运行一个kubectl命令,如下所示:

  • 我想做的是能够从客户机创建一个房间,但好像它是一个对象。例如:我有一个名为“room”的类,这个类实现了3个事件,所以当你创建一个新的room时,你可以在每个事件中触发这些事件。这可能吗?以下是我的服务器代码:

  • 在OpenFOAM中,存在一个函数,其名称为exp,表示数学中的幂操作。同时,C++本身也可以进行这个计算,并且函数名称也为exp。这会导致调用的时候,编译器并不知道应该调用OpenFOAM的exp还是C++本身的exp。一种方法是将其中一个exp函数进行改名,比如将OpenFOAM中的exp改成expFoam。但还有更简单的方式。 名称空间专门用于解决上面的问题,它可作为附加信息来区分不同库中相

  • 问题内容: 我刚刚开始学习Python,并在Python中遇到了 “命名空间” 概念。虽然我了解了它的本质,但无法理解这个概念的严重性。 网上的一些浏览显示,反对PHP的原因之一是它没有对名称空间的本地支持。 有人可以解释如何使用名称空间以及此功能如何使编程更好 (不只是在Python中,因为我假设名称空间的概念不限于特定语言)。 我主要来自Java和C编程背景。 问题答案: 命名空间是一种实现范

  • 问题内容: 有没有一种方法可以在python ElementTree中定义默认/无前缀的命名空间?这似乎不起作用… 这也不是: 可以,但是我必须在每个元素前加上前缀: 在OSX上使用Python 3.5。 编辑:如果答案为“否”,您仍然可以获得赏金:-)。我只是想要一个花了很多时间使用它的人的明确“否”。 问题答案: 没有简单的方法可以透明地处理默认名称空间。正如您已经提到的,为空名称空间分配非空