如何从命名空间字符串加载 argparse?

How to load argparse from Namespace string?

import argparse
parser = argparse.ArgumentParser(fromfile_prefix_chars='@')
parser.add_argument('--a', default=1)
args = parser.parse_args()

然后我将参数存储到文件中:

with open('/tmp/a', 'w') as f:
    f.write(str(args))

文件中的内容就是这样:

Namespace(a='2')

那么,如何将此字符串加载到 args 中?

刚刚测试过 - pickle 使用 argparse.Namespace 对象:

In [727]: import pickle
In [728]: pickle.dumps(argparse.Namespace(a=10))
Out[728]: b'\x80\x03cargparse\nNamespace\nq\x00)\x81q\x01}q\x02X\x01\x00\x00\x00aq\x03K\nsb.'
In [729]: pickle.loads(_)
Out[729]: Namespace(a=10)

这需要导入 argparse

以及我在评论中建议的字典泡菜:

In [730]: pickle.dumps(vars(_))
Out[730]: b'\x80\x03}q\x00X\x01\x00\x00\x00aq\x01K\ns.'
In [731]: pickle.loads(_)
Out[731]: {'a': 10}
  1 import argparse
  2 from argparse import Namespace
  3 
  4 parser = argparse.ArgumentParser()
  5 parser.add_argument('--a', default=1)
  6 args = parser.parse_args()
  7 
  8 import os
  9 if os.path.exists('/tmp/a'):
 10     with open('/tmp/a', 'r') as f:
 11         ns = f.read()
 12         print(ns)
 13         args = parser.parse_args(namespace=eval(ns))
 14 else:
 15     with open('/tmp/a', 'w') as f:
 16         f.write(str(args))
 17         
 18 print(args.a)

因为字符串 Namespace(a='2') 来自命名空间实例,所以我们可以评估它。