Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

Traitlets validates default even if overrided

未关闭
#548 3 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

评估

难度
3/5
预计耗时
1-2 天
新手友好度
35/100
Issue 类型
缺陷
描述清晰度
基本清楚
活跃度
停滞
技术栈
python
领域
tooling

调研方向

从 traitlets.py 中 HasTraits.setup_instance、instance_init 以及 traceback 中显示的 _validate 调用附近开始。使用 Foo() 和 Foo(bar='test') 两种方式通过 Foo 示例重现问题,然后检查现有的 trait 初始化测试。当提供的值无需验证未使用的无效默认值即可被接受,同时缺少值的情况仍会引发适当的错误时,即表示完成。

由索引模型根据 Issue 内容生成。

描述

To make a required trait, I thought I could use:

from traitlets import HasTraits, Unicode

class Foo(HasTraits): 
    bar = Unicode(default_value=None, allow_none=False, required=True) 

As expected, this raises a trait error, if Foo is instantiated without arguments:

f = Foo()

But: this also raises, when bar is provided:

f = Foo(bar='test')

This error is raised:

TraitError                                Traceback (most recent call last)
<ipython-input-8-a25b82aa7a35> in <module>
----> 1 Foo(bar='test')

/usr/lib/python3.8/site-packages/traitlets/traitlets.py in __new__(cls, *args, **kwargs)
    956         else:
    957             inst = new_meth(cls, *args, **kwargs)
--> 958         inst.setup_instance(*args, **kwargs)
    959         return inst
    960 

/usr/lib/python3.8/site-packages/traitlets/traitlets.py in setup_instance(self, *args, **kwargs)
    984         self._trait_notifiers = {}
    985         self._trait_validators = {}
--> 986         super(HasTraits, self).setup_instance(*args, **kwargs)
    987 
    988     def __init__(self, *args, **kwargs):

/usr/lib/python3.8/site-packages/traitlets/traitlets.py in setup_instance(self, *args, **kwargs)
    975             else:
    976                 if isinstance(value, BaseDescriptor):
--> 977                     value.instance_init(self)
    978 
    979 

/usr/lib/python3.8/site-packages/traitlets/traitlets.py in instance_init(self, obj)
    520             if (self._dynamic_default_callable(obj) is None) \
    521                     and (self.default_value is not Undefined):
--> 522                 v = self._validate(obj, self.default_value)
    523                 if self.name is not None:
    524                     obj._trait_values[self.name] = v

/usr/lib/python3.8/site-packages/traitlets/traitlets.py in _validate(self, obj, value)
    589             return value
    590         if hasattr(self, 'validate'):
--> 591             value = self.validate(obj, value)
    592         if obj._cross_validation_lock is False:
    593             value = self._cross_validate(obj, value)

/usr/lib/python3.8/site-packages/traitlets/traitlets.py in validate(self, obj, value)
   2052                 msg = "Could not decode {!r} for unicode trait '{}' of {} instance."
   2053                 raise TraitError(msg.format(value, self.name, class_of(obj)))
-> 2054         self.error(obj, value)
   2055 
   2056 

/usr/lib/python3.8/site-packages/traitlets/traitlets.py in error(self, obj, value)
    623             e = "The '%s' trait must be %s, but a value of %r was specified." \
    624                 % (self.name, self.info(), repr_type(value))
--> 625         raise TraitError(e)
    626 
    627     def get_metadata(self, key, default=None):

TraitError: The 'bar' trait of a Foo instance must be a unicode string, but a value of None <class 'NoneType'> was specified.
主要语言
Python
星标
653
派生
217
平均合并
2 天 21 小时
30 天内合并 PR
2

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

ipython/traitlets 的其他 Issue

查看 ipython/traitlets 的全部 Issue

相似的 Issue

更多 Python Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。