【问题标题】:Sympy TypeError: cannot determine truth value of Relational when dumping to YAMLSympy TypeError:转储到 YAML 时无法确定关系的真值
【发布时间】:2016-10-12 18:39:44
【问题描述】:

尝试将 sympy 表达式转储到 YAML 时出现此错误:

TypeError: cannot determine truth value of Relational

我要转储的是包含 2 个 sympy.Symbol 对象的集合。我不确定为什么 sympy 试图将其评估为 StrictLessThan 对象。 sympy 试图确定真值,也许是为了评估 mapping.sort() 函数?

这是回溯:

Traceback (most recent call last):
  File "E:/Matt/Documents/ProgrammingProjects/infinitree/abg.py", line 267, in <module>
    print yaml.dump(mtree)
  File "C:\Python27\lib\site-packages\yaml\__init__.py", line 202, in dump
    return dump_all([data], stream, Dumper=Dumper, **kwds)
  File "C:\Python27\lib\site-packages\yaml\__init__.py", line 190, in dump_all
    dumper.represent(data)
  File "C:\Python27\lib\site-packages\yaml\representer.py", line 28, in represent
    node = self.represent_data(data)
  File "C:\Python27\lib\site-packages\yaml\representer.py", line 61, in represent_data
    node = self.yaml_multi_representers[data_type](self, data)
  File "C:\Python27\lib\site-packages\yaml\representer.py", line 434, in represent_object
    u'tag:yaml.org,2002:python/object:'+function_name, state)
  File "C:\Python27\lib\site-packages\yaml\representer.py", line 123, in represent_mapping
    node_value = self.represent_data(item_value)
  File "C:\Python27\lib\site-packages\yaml\representer.py", line 61, in represent_data
    node = self.yaml_multi_representers[data_type](self, data)
  File "C:\Python27\lib\site-packages\yaml\representer.py", line 434, in represent_object
    u'tag:yaml.org,2002:python/object:'+function_name, state)
  File "C:\Python27\lib\site-packages\yaml\representer.py", line 123, in represent_mapping
    node_value = self.represent_data(item_value)
  File "C:\Python27\lib\site-packages\yaml\representer.py", line 57, in represent_data
    node = self.yaml_representers[data_types[0]](self, data)
  File "C:\Python27\lib\site-packages\yaml\representer.py", line 223, in represent_dict
    return self.represent_mapping(u'tag:yaml.org,2002:map', data)
  File "C:\Python27\lib\site-packages\yaml\representer.py", line 123, in represent_mapping
    node_value = self.represent_data(item_value)
  File "C:\Python27\lib\site-packages\yaml\representer.py", line 61, in represent_data
    node = self.yaml_multi_representers[data_type](self, data)
  File "C:\Python27\lib\site-packages\yaml\representer.py", line 434, in represent_object
    u'tag:yaml.org,2002:python/object:'+function_name, state)
  File "C:\Python27\lib\site-packages\yaml\representer.py", line 123, in represent_mapping
    node_value = self.represent_data(item_value)
  File "C:\Python27\lib\site-packages\yaml\representer.py", line 61, in represent_data
    node = self.yaml_multi_representers[data_type](self, data)
  File "C:\Python27\lib\site-packages\yaml\representer.py", line 434, in represent_object
    u'tag:yaml.org,2002:python/object:'+function_name, state)
  File "C:\Python27\lib\site-packages\yaml\representer.py", line 123, in represent_mapping
    node_value = self.represent_data(item_value)
  File "C:\Python27\lib\site-packages\yaml\representer.py", line 57, in represent_data
    node = self.yaml_representers[data_types[0]](self, data)
  File "C:\Python27\lib\site-packages\yaml\representer.py", line 223, in represent_dict
    return self.represent_mapping(u'tag:yaml.org,2002:map', data)
  File "C:\Python27\lib\site-packages\yaml\representer.py", line 123, in represent_mapping
    node_value = self.represent_data(item_value)
  File "C:\Python27\lib\site-packages\yaml\representer.py", line 57, in represent_data
    node = self.yaml_representers[data_types[0]](self, data)
  File "C:\Python27\lib\site-packages\yaml\representer.py", line 223, in represent_dict
    return self.represent_mapping(u'tag:yaml.org,2002:map', data)
  File "C:\Python27\lib\site-packages\yaml\representer.py", line 123, in represent_mapping
    node_value = self.represent_data(item_value)
  File "C:\Python27\lib\site-packages\yaml\representer.py", line 61, in represent_data
    node = self.yaml_multi_representers[data_type](self, data)
  File "C:\Python27\lib\site-packages\yaml\representer.py", line 434, in represent_object
    u'tag:yaml.org,2002:python/object:'+function_name, state)
  File "C:\Python27\lib\site-packages\yaml\representer.py", line 123, in represent_mapping
    node_value = self.represent_data(item_value)
  File "C:\Python27\lib\site-packages\yaml\representer.py", line 57, in represent_data
    node = self.yaml_representers[data_types[0]](self, data)
  File "C:\Python27\lib\site-packages\yaml\representer.py", line 229, in represent_set
    return self.represent_mapping(u'tag:yaml.org,2002:set', value)
  File "C:\Python27\lib\site-packages\yaml\representer.py", line 120, in represent_mapping
    mapping.sort()
  File "C:\Python27\lib\site-packages\sympy\core\relational.py", line 195, in __nonzero__
    raise TypeError("cannot determine truth value of Relational")
TypeError: cannot determine truth value of Relational

【问题讨论】:

    标签: python yaml sympy pyyaml


    【解决方案1】:

    表示器尝试对集合进行排序,该集合的转储方式与 dict 类似,方法是按键值对对其项目进行排序,然后转储它们。我不知道sympy 的详细信息,但是对于排序,需要知道键和值的表示(对于一个集合,只使用键),这通常是使用字符串表示来完成的,我猜, 引起评价。所以mapping.sort() 评估它用作键的sympy 对象,而不是相反(正如您在问题中指出的那样)

    然而,问题不仅仅是排序,sympy 对象不能在没有额外的表示例程的情况下被转储:

    import sys
    import ruamel.yaml
    from sympy.abc import x, y
    from  sympy.core.relational import Relational
    
    data = Relational(y, x+x**2, '==')
    
    ruamel.yaml.round_trip_dump(data, sys.stdout)
    

    还有哪些错误:

    ruamel.yaml.representer.RepresenterError: cannot represent an object: Eq(y, x**2 + x)
    

    所以我会从简单的开始,为您使用并希望转储的对象类型创建表示器,然后这些对象的集合也应该是可转储的。


    我使用了我的 ruamel.yaml 库,而不是仅支持 YAML 1.1 规范的过时 PyYAML。在这个问题上,两者的行为方式应该相同。

    【讨论】:

    • 感谢您的意见。我明天试一试
    • Stack Overflow 和 ruamel.yaml/PyYAML 文档中有代表示例。如果这还不够,您知道在哪里询问,但请确保包含一些最小的示例代码(这使得帮助更容易)。
    • 嗨@Anton,谢谢你的建议,我真的很感激。我没有在帖子中包含很多代码,因为我已经对我试图转储的一些类进行了子类化,而且我不想发布太多以至于愿意提供帮助的人会不知所措。如果您认为我应该在帖子中包含任何其他内容以帮助您和其他人更好地理解上下文,请告诉我。我想在我试图简洁的时候,我可能剪掉了太多。
    • @Matt 除非有人完全按照您的做法进行操作,否则错误消息对于确定可能发生的情况没有多大帮助。对我来说,这还不足以重现事物。所以我只是尝试(以前从未做过)转储一些sympy 的东西。我更喜欢用一些代码提出问题:一个引发错误的最小示例。制作这样一个最小的例子可能是一种努力,但它可能会帮助你定位原因,或者发现(正如我在这里怀疑的那样)你的错误是一些后续错误。
    • 我不了解 yaml 转储程序,但往返 SymPy 表达式的最佳方法是使用 srepr()sympify()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    相关资源
    最近更新 更多