Failure to scale in pyclipper - TypeError: 'Zero' object is not iterable
Failure to scale in pyclipper - TypeError: 'Zero' object is not iterable
我刚刚遇到一个 TypeError
我以前从未见过并且无法弄清楚为什么会发生。谷歌搜索错误 TypeError: 'Zero' object is not iterable
returns 没有结果。我在 python 2.7 和 3.5 中测试过,两种情况下的错误都是一样的。
这是 MCVE:
from sympy.geometry.polygon import Polygon
import pyclipper as pc
start_list = [(0, 2), (2, 2), (2, 0), (0, 0)]
scaled = pc.scale_to_clipper(start_list) # this works fine
as_poly = Polygon(*start_list)
new_list = [(pt.x, pt.y) for pt in as_poly.vertices]
assert new_list == start_list # check that the lists are the same (this passes)
fail_to_scale = pc.scale_to_clipper(new_list) # this fails
以及回溯:
Traceback (most recent call last):
File "C:\Users\Jamie\<blah>\mcve.py", line 10, in <module>
fails = pc.scale_to_clipper(new_list)
File "pyclipper/pyclipper.pyx", line 544, in pyclipper.scale_to_clipper (pyclipper/pyclipper.cpp:3535)
File "pyclipper/pyclipper.pyx", line 542, in pyclipper.scale_to_clipper.scale_value (pyclipper/pyclipper.cpp:3454)
File "pyclipper/pyclipper.pyx", line 542, in pyclipper.scale_to_clipper.scale_value (pyclipper/pyclipper.cpp:3454)
File "pyclipper/pyclipper.pyx", line 542, in pyclipper.scale_to_clipper.scale_value (pyclipper/pyclipper.cpp:3416)
TypeError: 'Zero' object is not iterable
有人知道这个错误的来源和解决方法吗?
这已在 PyClipper 版本 1.0.2 中修复,这比使用下面描述的解决方法更可取
好的,我已经将问题追溯到 Polygon
中存储的值。问题是值 0
被 SymPy 存储为 sympy.Zero
.
这些 sympy.Zero
值不被 polyclipper.scale_to_clipper()
接受,因此在检查时提高 TypeError
。
为了避免这个问题,我可以生成 new_list
将 pt.x
和 pt.y
转换为 float
:
new_list = [(float(pt.x), float(pt.y)) for pt in as_poly.vertices]
我刚刚遇到一个 TypeError
我以前从未见过并且无法弄清楚为什么会发生。谷歌搜索错误 TypeError: 'Zero' object is not iterable
returns 没有结果。我在 python 2.7 和 3.5 中测试过,两种情况下的错误都是一样的。
这是 MCVE:
from sympy.geometry.polygon import Polygon
import pyclipper as pc
start_list = [(0, 2), (2, 2), (2, 0), (0, 0)]
scaled = pc.scale_to_clipper(start_list) # this works fine
as_poly = Polygon(*start_list)
new_list = [(pt.x, pt.y) for pt in as_poly.vertices]
assert new_list == start_list # check that the lists are the same (this passes)
fail_to_scale = pc.scale_to_clipper(new_list) # this fails
以及回溯:
Traceback (most recent call last):
File "C:\Users\Jamie\<blah>\mcve.py", line 10, in <module>
fails = pc.scale_to_clipper(new_list)
File "pyclipper/pyclipper.pyx", line 544, in pyclipper.scale_to_clipper (pyclipper/pyclipper.cpp:3535)
File "pyclipper/pyclipper.pyx", line 542, in pyclipper.scale_to_clipper.scale_value (pyclipper/pyclipper.cpp:3454)
File "pyclipper/pyclipper.pyx", line 542, in pyclipper.scale_to_clipper.scale_value (pyclipper/pyclipper.cpp:3454)
File "pyclipper/pyclipper.pyx", line 542, in pyclipper.scale_to_clipper.scale_value (pyclipper/pyclipper.cpp:3416)
TypeError: 'Zero' object is not iterable
有人知道这个错误的来源和解决方法吗?
这已在 PyClipper 版本 1.0.2 中修复,这比使用下面描述的解决方法更可取
好的,我已经将问题追溯到 Polygon
中存储的值。问题是值 0
被 SymPy 存储为 sympy.Zero
.
这些 sympy.Zero
值不被 polyclipper.scale_to_clipper()
接受,因此在检查时提高 TypeError
。
为了避免这个问题,我可以生成 new_list
将 pt.x
和 pt.y
转换为 float
:
new_list = [(float(pt.x), float(pt.y)) for pt in as_poly.vertices]