TypeError:当我尝试在parse.parse_args()中传递三个参数时,'int'对象不可订阅

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TypeError:当我尝试在parse.parse_args()中传递三个参数时,'int'对象不可订阅相关的知识,希望对你有一定的参考价值。

ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", help="Path to input image", required=True)
ap.add_argument("-p", "--pivot-point", help="Pivot point coordinates x, y separated by comma (,)", required=True)
ap.add_argument("-s", "--scale", help="Scale to zoom", type = int, required=True)
args = vars(ap.parse_args(['image.jpeg', '(144,72)', 3]))

你好,

我试图在参数中传递一个图像来旋转它并缩放它以通过argparse进行缩放。

但是我收到以下错误:

请让我知道你做错了什么。

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-131-c7157827dce9> in <module>()
      3 ap.add_argument("-p", "--pivot-point", help="Pivot point coordinates x, y separated by comma (,)", required=True)
      4 ap.add_argument("-s", "--scale", help="Scale to zoom", type = int, required=True)
----> 5 args = vars(ap.parse_args(['image.jpeg', '(144,72)', 3]))

~/anaconda3/lib/python3.6/argparse.py in parse_args(self, args, namespace)
   1728     # =====================================
   1729     def parse_args(self, args=None, namespace=None):
-> 1730         args, argv = self.parse_known_args(args, namespace)
   1731         if argv:
   1732             msg = _('unrecognized arguments: %s')

~/anaconda3/lib/python3.6/argparse.py in parse_known_args(self, args, namespace)
   1760         # parse the arguments and exit if there are any errors
   1761         try:
-> 1762             namespace, args = self._parse_known_args(args, namespace)
   1763             if hasattr(namespace, _UNRECOGNIZED_ARGS_ATTR):
   1764                 args.extend(getattr(namespace, _UNRECOGNIZED_ARGS_ATTR))

~/anaconda3/lib/python3.6/argparse.py in _parse_known_args(self, arg_strings, namespace)
   1801             # and note the index if it was an option
   1802             else:
-> 1803                 option_tuple = self._parse_optional(arg_string)
   1804                 if option_tuple is None:
   1805                     pattern = 'A'

~/anaconda3/lib/python3.6/argparse.py in _parse_optional(self, arg_string)
   2087 
   2088         # if it doesn't start with a prefix, it was meant to be positional
-> 2089         if not arg_string[0] in self.prefix_chars:
   2090             return None
   2091 

TypeError: 'int' object is not subscriptable
答案

解析器通常处理sys.argv[1:],它是shell生成的字符串列表。使用您自己的列表进行测试也需要字符串。注意使用'3'而不是3

In [182]: ap.parse_args(['image.jpeg', '(144,72)', '3'])
usage: ipython3 [-h] -i IMAGE -p PIVOT_POINT -s SCALE
ipython3: error: the following arguments are required: -i/--image, -p/--pivot-point, -s/--scale
An exception has occurred, use %tb to see the full traceback.

SystemExit: 2

现在它给出了标准化的argparse错误以及使用和有用的诊断。

如果我们提供您告诉它期望的短选项标志:

In [183]: ap.parse_args(['-i','image.jpeg', '-p','(144,72)', '-s' '3'])
Out[183]: Namespace(image='image.jpeg', pivot_point='(144,72)', scale=3)
In [184]: vars(_)
Out[184]: {'image': 'image.jpeg', 'pivot_point': '(144,72)', 'scale': 3}

或者我们可以使用split更清楚地了解正确的命令行将是什么样子:

In [186]: ap.parse_args("-i image.jpeg -p (144,72) -s 3".split())
Out[186]: Namespace(image='image.jpeg', pivot_point='(144,72)', scale=3)

由于您已将-s定义为type=int,因此它将字符串“3”转换为整数。

对于-p你可能想尝试nargs=2,允许你使用'-p 144 72'。

ap.add_argument("-p", "--pivot-point", nargs=2, metavar=('x','y'), 
    type=int, help="Pivot point coordinates")

我明白了:

In [196]: ap.print_help()
usage: ipython3 [-h] -i IMAGE -p x y -s SCALE

optional arguments:
  -h, --help            show this help message and exit
  -i IMAGE, --image IMAGE
                        Path to input image
  -p x y, --pivot-point x y
                        Pivot point coordinates
  -s SCALE, --scale SCALE
                        Scale to zoom

In [197]: ap.parse_args("-i image.jpeg -p 144 72 -s 3".split())
Out[197]: Namespace(image='image.jpeg', pivot_point=[144, 72], scale=3)
另一答案

更换

args = vars(ap.parse_args(['image.jpeg', '(144,72)', 3]))

args = vars(ap.parse_args(['image.jpeg', '(144,72)', '3']))   #string '3'. 'type = int' will convert it to an int object

MoreInfo

另一答案

列表中传递给parse_args的所有元素都需要是字符串,由参数解析器决定将字符串解释为您设置的类型。

以上是关于TypeError:当我尝试在parse.parse_args()中传递三个参数时,'int'对象不可订阅的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试测试 react-bootstrap 组件时,我得到 TypeError: Enzyme::Selector expects a string, object, or Component Co

TypeError:尝试上传图像时无法读取未定义的属性“路径”

尝试在 Keras 中创建 BLSTM 网络时出现 TypeError

TypeError:无法读取reactjs中未定义的属性“长度”

TypeError:无法读取未定义的属性“userAgent”

TypeError:无法读取 JSONPlaceholder 未定义的属性“url”