gpt4 book ai didi

python - 如何创建 Python 命名空间(argparse.parse_args 值)?

转载 作者:IT老高 更新时间:2023-10-28 21:39:16 25 4
gpt4 key购买 nike

为了交互式地测试我的 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 为真。
  • 这两个类都有一个有用的 __repr__ 来显示它们有哪些属性。
  • Namespace() 对象支持包含测试;如果命名空间实例具有属性 namend attrname,则 'attrname' in instance 为真。 SimpleNamespace 没有。
  • Namespace() 对象有一个未记录的 ._get_kwargs() 方法,该方法返回 (name, value) 属性的排序列表实例。您可以使用 sorted(vars(instance).items()) 为任一类获得相同的结果。
  • 虽然 SimpleNamespace() 用 C 实现,Namespace() 用 Python 实现,但属性访问并不快,因为两者都使用相同的 __dict__属性的存储。 SimpleNamespace() 实例的相等性测试和生成表示要快一些。

关于python - 如何创建 Python 命名空间(argparse.parse_args 值)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28345780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com