2016-06-12 4 views
3

ich diesen Fehler, wenn ein sympy Ausdruck YAML-Dump versuchen:Sympy Typeerror: kann nicht Wahrheitswert von Relational bestimmen, wann YAML Dumping

TypeError: cannot determine truth value of Relational 

Was ich versuche, ist zu dump ein Satz mit 2 sympy.Symbol Objekte. Ich bin mir nicht sicher, warum Sympy versucht, es als StrictLessThan Objekt zu bewerten. sympy versucht, den Wahrheitswert zu bestimmen, vielleicht um die mapping.sort() Funktion zu bewerten? Hier

ist die Zurückverfolgungs:

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 

Antwort

2

Die Representer versucht, den Satz zu sortieren, die in ähnlicher Weise wie ein dict abgeladen wird, durch seine Einzelteile durch Schlüsselwertpaare Sortieren und dann diejenigen, Dumping. Ich kenne die Details von sympy nicht, aber für die Sortierung muss eine Darstellung des Schlüssels und des Wertes bekannt sein (für einen Satz wird nur der Schlüssel verwendet) und das wird oft mit Hilfe der Zeichenfolgendarstellung gemacht, was, denke ich, verursacht Die Bewertung. So ist die mapping.sort() wertet die sympy Objekte als Schlüssel verwendet, nicht umgekehrt (wie Sie in Ihrer Frage angegeben könnte der Fall gewesen)

jedoch nicht nur die Sortierung ist, dass das Problem ist, kann sympy Objekte nicht ohne zusätzliche Representer Routinen abgeladen:

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) 

die auch Fehler:

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

Also ich würde einfach anfangen, durch representers für Ihre Objekttypen Sie macht uns e und wollen ablegen und dann Sammlungen von denen sollten auch dumpable sein.


Früher habe ich meine ruamel.yaml Bibliothek anstelle der veralteten PyYAML, die nur die Spezifikationen YAML 1.1 unterstützt. Beide sollten sich in dieser Hinsicht genauso verhalten.

+0

Danke für die Eingabe. Ich werde es morgen versuchen – themantalope

+0

Es gibt Beispiele Repräsentanten hier auf [so] und in der ruamel.yaml/PyYAML docs. Wenn das nicht ausreicht, wissen Sie, wo Sie nachfragen müssen, aber stellen Sie sicher, dass Sie einen minimalen Beispielcode einfügen (das erleichtert die Arbeit erheblich). – Anthon

+0

Hallo @Anton, danke für die Vorschläge, ich schätze es wirklich. Ich habe in der Post nicht viel Code eingeschlossen, da ich einige der Klassen, die ich zu löschen versuche, subclassiert hatte, und ich wollte nicht so viel posten, dass jemand, der bereit ist zu helfen, überwältigt werden würde. Wenn es noch etwas gibt, von dem Sie denken, dass ich es in den Beitrag aufnehmen sollte, das Ihnen und anderen helfen würde, den Kontext besser zu verstehen, lassen Sie es mich wissen. Ich denke, in meinem Versuch, zu präzisieren, habe ich vielleicht zu viel ausgeschnitten. – themantalope

Verwandte Themen