小编jha*_*sen的帖子

argparse:如何允许带有 nargs="*" 和选项的空列表

在 中argparse,如何创建一个可选的位置命令行选项,该选项采用多个参数,这些参数都需要成为选择列表的一部分?

在下面的示例中,我想允许列表的任何子集['a', 'b', 'c']——即['a'], ['a', 'c'], ... 以及至关重要的空列表[]。我期待以下实现这一点,但如果省略参数,它就会失败。

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('letters', nargs='*', choices=['a', 'b', 'c'])
args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)
error: argument letters: invalid choice: [] (choose from 'a', 'b', 'c')
Run Code Online (Sandbox Code Playgroud)

更新:此后我发现这choices=['a', 'b', 'c', []]似乎可以完成这项工作。这让我感到不一致,因为它表明argparse检查[] in choiceswhich 将意味着它也['a']应该在choices(而不是'a')中。

python argparse

6
推荐指数
1
解决办法
1553
查看次数

为自定义类继承 std::vector::iterator?

我正在实现一个包含 STLstd::vector作为中央数据成员的自定义类。现在,我希望这个类提供一个迭代器,它只需要遍历这个向量,并且还可以与基于 C++11 范围的迭代一起使用。以某种方式继承迭代器是非常诱人的,std::vector::iterator因为它应该做完全相同的工作。这是可能的还是我需要实现一个完全自定义的迭代器?

class Custom {
private:
  std::vector<double> _data;
public:
  class iterator {
    // Want this to provide an interface to iterate through _data
    // ...
  };
  // ...
};

Custom C;
// Populate C with data ...
for (const auto& item : C) {
  // This should print the elements within _data.
  std::cout << item << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

c++ iterator stl vector c++11

5
推荐指数
1
解决办法
2872
查看次数

模拟将函数参数分配给* args和** kwargs

有没有一种简单的方法可以“模拟”参数对函数参数的分配?

说我有一个功能

def fn(a, b, c='default', *args, **kwargs):
    print(f'a={a}, b={b}, c={c}')
    print(f'args={args}')
    print(f'kwargs={kwargs}')
Run Code Online (Sandbox Code Playgroud)

我用以下方式称呼它:

>>> args = (1, 2, 3, 4)
>>> kwargs = {'extra_kw': 5}
>>> fn(*args, **kwargs)
a=1, b=2, c=3
args=(4,)
kwargs={'extra_kw': 5}
Run Code Online (Sandbox Code Playgroud)

我想提取什么args并将kwargs在函数中fn,而无需调用fn

基本上,我试图编写一个函数,该函数将一个函数以及一个参数列表和字典作为输入,并返回多余的argskwargs

def extract_extra_args_and_kwargs(f, *args, **kwargs):
    ...
Run Code Online (Sandbox Code Playgroud)

该示例的预期结果将是:

>>> extract_extra_args_and_kwargs(fn, args, kwargs)
((4,), {'extra_kw': 5})
Run Code Online (Sandbox Code Playgroud)

我尝试过使用inspect.signature,但是考虑到Python本身必须在某个地方解决此分配问题,所以我希望可以直接访问相应的函数。

python

5
推荐指数
2
解决办法
78
查看次数

标签 统计

python ×2

argparse ×1

c++ ×1

c++11 ×1

iterator ×1

stl ×1

vector ×1