【问题标题】:TypeError: unsupported operand type(s) for -:TypeError:不支持的操作数类型 -:
【发布时间】:2020-02-29 02:49:47
【问题描述】:

“我对编程完全陌生”。我安装了 dynasor 软件,当我运行它时,遇到了一些问题。我试图解决它们,但我不知道如何解决以下问题:

Traceback (most recent call last):
  File "/usr/bin/dynasor", line 4, in <module>
    __import__('pkg_resources').run_script('dynasor==0.1.2', 'dynasor')
  File "/usr/lib/python3.5/site-packages/pkg_resources/__init__.py", line 666, in run_script
    self.require(requires)[0].run_script(script_name, ns)
  File "/usr/lib/python3.5/site-packages/pkg_resources/__init__.py", line 1462, in run_script
    exec(code, namespace, namespace)
  File "/usr/lib/python3.5/site-packages/dynasor-0.1.2-py3.5-cygwin-3.0.7-i686.egg/EGG-INFO/scripts/dynasor", line 536, in <module>
    fn and writer(fn, output)
  File "/usr/lib/python3.5/site-packages/dynasor-0.1.2-py3.5-cygwin-3.0.7-i686.egg/dsf/output.py", line 39, in create_mfile
    fh.write("\n%% %s\n%s = ...\n%s;\n" % (desc, n, str(v)))
  File "/usr/lib/python3.5/site-packages/numpy/core/arrayprint.py", line 1463, in array_str
    return array2string(a, max_line_width, precision, suppress_small, ' ', "")
  File "/usr/lib/python3.5/site-packages/numpy/core/arrayprint.py", line 623, in array2string
    options['linewidth'] -= len(suffix)
TypeError: unsupported operand type(s) for -=: 'str' and 'int'

在这里“TypeError: unsupported operand type(s) for -: 'str' and 'int'”我找到了一个解决方案,但它对我不起作用。 例如,当我将len(int(suffix)) 放入“arrayprint.py”第 623 行时,我面临另一个错误:

options['linewidth'] -= len(int(suffix)) ValueError: invalid literal for int() with base 10: ''

或者当我输入 int(len(suffix)) 时,它给出了这个错误:

options['linewidth'] -= int(len(suffix)) TypeError: unsupported operand type(s) for -=: 'str' and 'int'

我以这种方式安装了dynasor“pip3.5 install dynasor”,也以这种方式安装了numpy“pip3.5 install numpy==1.14.1”。

【问题讨论】:

    标签: python-3.x string int


    【解决方案1】:

    答案:

    在您的回溯结束时:

    File "/usr/lib/python3.5/site-packages/numpy/core/arrayprint.py", line 623, in array2string
        options['linewidth'] -= len(suffix)
    TypeError: unsupported operand type(s) for -=: 'str' and 'int
    

    这意味着您试图用 int 减去 string,这是不可能的。
    函数len(...) 总是给你一个int,所以看起来options['linewidth'] 是一个字符串
    我建议您在代码中设置options['linewidth'] 的值的任何位置,首先使用int(...) 转换此值。
    如果options['linewidth'] 来自库并且您无法更改设置其值的代码,您仍然可以在使用它之前执行options['linewidth'] = int(options['linewidth'])

    旁注:

    您需要了解每个变量都有一个类型,并且每个类型都有您可以对它们执行的受限操作:
    -> int(...) 函数将尝试将你给它的内容转换为 int,如果你给它一个 float(十进制数),它将去掉小数部分,如果你给它一个代表intstring,比如'-42',它会尝试将它转换成一个int,但是如果你给它一个可以' 不被解释为 int,例如 'dog' 会引发错误 ValueError: invalid literal for int() with base 10: 'dog'
    -> 在 string 上使用 len(...) 总是会给你作为 int 的字符串大小,所以使用 int(len(...)) 是多余的。

    【讨论】:

    • 感谢您的回答,您的意思是我用“int(options['linewidth'])”替换每个“options['linewidth']”,如果是,我做到了,但不幸的是不起作用。
    • 不,你不能这样做,相反,你可以在使用options['linewidth'] 做任何事情之前先做options['linewidth'] = int(options['linewidth'])
    • 我之前解决的问题是关于“Python map object is not subscriptable”,我用list(map())替换了每个map(),但它在另一个文件中(我的意思是一个文件名的“发电机”)。以上错误在“arrayprint.py”文件中。你觉得这两件事有关系吗?
    • 我看不出这些之间有任何关系。 list(...) 可以将任何内容转换为列表,但在您的情况下,错误来自字符串和 int 之间的减法
    猜你喜欢
    • 2011-03-08
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 2012-12-26
    • 1970-01-01
    • 2021-05-23
    相关资源
    最近更新 更多