Notifying a trait with a DataFrame instance throws Value Error
まだ誰も着手していません。
評価
- 難易度
- 3/5
- 見積もり時間
- 1〜2日
- 初心者へのやさしさ
- 35/100
調査の方向性
traitlets.py の366行目にある link._update_target から始め、次に pandas を使って issue の DataFrame の例を再現します。比較結果がブール値でない場合にどのように処理されるかを確認してください。pandas DataFrame インスタンスを含む traits をリンクしても、示されている ValueError が発生しなくなれば完了です。
索引モデルが issue の本文から書いたものです。
説明
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!
- 主要言語
- Python
- スター
- 653
- フォーク
- 217
- 平均マージ
- 2日 21時間
- マージ済み PR(30日)
- 2
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
ipython/traitlets のほかの issue
-
難易度 1/5 1時間未満 初心者へのやさしさ 65/100
-
難易度 1/5 1〜3時間 初心者へのやさしさ 65/100
-
good first issue
難易度 1/5 1時間未満 初心者へのやさしさ 85/100
-
documentation
難易度 1/5 1時間未満 初心者へのやさしさ 65/100
-
難易度 3/5 1〜2日 初心者へのやさしさ 45/100
ipython/traitlets の issue をすべて見る
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
anthropics/skills#1811 · コメント 1 件 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
speaches-ai/speaches#678 ·
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
datalayer/mcp-compose#42 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
conda-forge/spacy-feedstock#177 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
UKGovernmentBEIS/inspect_evals#2523 ·