Hacktoberfest 2026 : les issues que les mainteneurs ont marquées pour octobre, ouvertes et accessibles aux débutants. Parcourir les issues Hacktoberfest

Notifying a trait with a DataFrame instance throws Value Error

Ouverte
#756 3 commentaires 2 réactions 0 personnes assignées Voir sur GitHub

@MbappeWU y travaille déjà.

Depuis le 4/10/2026.

  • #988 par @MbappeWU — ouverte

Évaluation

Difficulté
3/5
Temps estimé
1-2 jours
Accessibilité débutants
35/100
Type d'issue
Bug
Clarté
Plutôt claire
Activité
À l'abandon
Stack technique
pandas, python
Domaine
tooling

Piste de recherche

Commencez à la ligne 366 de traitlets.py, dans link._update_target, puis reproduisez avec pandas l’exemple de DataFrame de l’issue. Vérifiez comment le résultat de la comparaison est traité lorsqu’il ne s’agit pas d’un booléen. C’est terminé lorsque la liaison de traits contenant des instances de pandas DataFrame ne déclenche plus le ValueError indiqué.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

Hey there,

At first, thank you for this amazing library!

I noticed that there are problems when linking multiple objects using the link function, if the value of a trait is a dataframe.
To me it looks like the compare logic overridden by pandas is causing the problem.
Here is an example:

import traitlets
from traitlets import link, directional_link
import pandas as pd

class SomeClass(traitlets.HasTraits):
    df = traitlets.Instance(klass=pd.DataFrame, allow_none=True)

foo = SomeClass()
baz = SomeClass()
bar = SomeClass()


# Will not work
link((foo, "df"), (baz, "df"))
foo.df = pd.DataFrame() # Throws ValueError

Stacktrace:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
traitlets_dataframe.ipynb Cell 4' in <cell line: 5>()
      2 link((foo, "df"), (baz, "df"))
      4 # Throws ValueError
----> 5 foo.df = pd.DataFrame()

File .\lib\site-packages\traitlets\traitlets.py:712, in TraitType.__set__(self, obj, value)
    710     raise TraitError('The "%s" trait is read-only.' % self.name)
    711 else:
--> 712     self.set(obj, value)

File .\lib\site-packages\traitlets\traitlets.py:701, in TraitType.set(self, obj, value)
    697     silent = False
    698 if silent is not True:
    699     # we explicitly compare silent to True just in case the equality
    700     # comparison above returns something other than True/False
--> 701     obj._notify_trait(self.name, old_value, new_value)

File .\lib\site-packages\traitlets\traitlets.py:1371, in HasTraits._notify_trait(self, name, old_value, new_value)
   1370 def _notify_trait(self, name, old_value, new_value):
-> 1371     self.notify_change(
   1372         Bunch(
   1373             name=name,
   1374             old=old_value,
   1375             new=new_value,
   1376             owner=self,
   1377             type="change",
   1378         )
   1379     )

File .\lib\site-packages\traitlets\traitlets.py:1383, in HasTraits.notify_change(self, change)
   1381 def notify_change(self, change):
   1382     """Notify observers of a change event"""
-> 1383     return self._notify_observers(change)

File .\lib\site-packages\traitlets\traitlets.py:1428, in HasTraits._notify_observers(self, event)
   1425 elif isinstance(c, EventHandler) and c.name is not None:
   1426     c = getattr(self, c.name)
-> 1428 c(event)

File .\lib\site-packages\traitlets\traitlets.py:366, in link._update_target(self, change)
    364 with self._busy_updating():
    365     setattr(self.target[0], self.target[1], self._transform(change.new))
--> 366     if getattr(self.source[0], self.source[1]) != change.new:
    367         raise TraitError(
    368             "Broken link {}: the source value changed while updating "
    369             "the target.".format(self)
    370         )

File .\lib\site-packages\pandas\core\generic.py:1527, in NDFrame.__nonzero__(self)
   1525 @final
   1526 def __nonzero__(self):
-> 1527     raise ValueError(
   1528         f"The truth value of a {type(self).__name__} is ambiguous. "
   1529         "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
   1530     )

ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

As you can see, hhe problem is in traitlets.py: 366, because getattr(self.source[0], self.source[1]) != change.new does not return a bool value in the case of a DataFrame.

Would it be possible to make this function compatible with pandas, or possibly define a custom function for comparison?

Thank you in advance!

Langage dominant
Python
Étoiles
653
Forks
221
Métriques de merge des PR
Aucune PR mergée en 30 j

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de ipython/traitlets

Toutes les issues de ipython/traitlets

Issues similaires

Plus d'issues Python

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.