2016-06-12 1 views
3

Je reçois cette erreur lorsque vous essayez de vider une expression sympy à YAML:sympy TypeError: ne peut pas déterminer la valeur de vérité de Relational lorsque le dumping à YAML

TypeError: cannot determine truth value of Relational 

Ce que je suis en train de jeter est un jeu avec 2 sympy.Symbol objets. Je ne sais pas pourquoi sympy essaie de l'évaluer en tant qu'objet StrictLessThan. sympy essaie de déterminer la valeur de vérité, peut-être pour évaluer la fonction mapping.sort()?

Voici le retraçage:

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 

Répondre

2

Le representer essaie de trier l'ensemble, qui est déversé de manière similaire comme dict, en triant ses éléments par paires clé-valeur et le dumping ceux-ci. Je ne connais pas les détails de sympy, mais pour le tri une représentation de la clé et de la valeur doit être connue (pour un ensemble seulement la clé est utilisée) et cela est souvent fait en utilisant la représentation de chaîne, qui, je suppose, provoque l'évaluation. Ainsi, le mapping.sort() évalue les objets sympy qu'il utilise comme clés, et non l'inverse (comme vous l'indiquez dans votre question aurait pu être le cas)

Cependant, il est non seulement le tri qui est le problème, sympy objets ne peuvent pas être déchetterie sans routines rEPRESENTER supplémentaires:

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) 

qui erreurs ainsi:

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

Je commencerais simple, en faisant Representers pour vos types d'objets que vous nous e et que vous souhaitez vider et ensuite les collections de ceux-ci devraient être également jetables.


J'ai utilisé ma bibliothèque ruamel.yaml au lieu du PyYAML obsolète qui ne supporte que les YAML 1.1 spécifications. Les deux devraient se comporter de la même manière en ce qui concerne cette question.

+0

Merci pour l'entrée. Je vais essayer demain – themantalope

+0

Il y a des exemples de représentants ici sur [so] et dans les docs ruamel.yaml/PyYAML. Si cela ne suffit pas, vous savez où demander, mais assurez-vous d'inclure un exemple de code minimal (ce qui facilite grandement les choses). – Anthon

+0

Salut @Anton, merci pour les suggestions, je l'apprécie vraiment. Je n'ai pas inclus beaucoup de code dans le post depuis que j'avais sous-classé certaines des classes que j'essaie de faire tomber, et je ne voulais pas poster tellement que quelqu'un qui est prêt à aider serait submergé. S'il y a autre chose que vous pensez que je devrais inclure dans le post qui pourrait vous aider et aider les autres à mieux comprendre le contexte, s'il vous plaît faites le moi savoir. Je suppose que dans ma tentative de concision, j'ai peut-être trop découpé. – themantalope