翻译自: Traitlets Guide

Using Traitlets

总而言之,traitlets可以让用户定义一个类有以下功能:

  1. 可以进行类型检查的属性和动态计算默认值
  2. 当属性被改变Traits会发起一个改变事件
  3. Traitlets可以进行验证,并且允许在赋值的时候使用新的属性值。允许用户基于其他属性值自定义属性验证逻辑。

Default values, and checking type and value

最基本的功能,traitlets提供了类型检查,以及在traitlets.HasTraits子类上动态生成默认的值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import getpass
class Identity(HasTraits):
username = Unicode()
# 生成默认值
@default('username')
def _default_username(self):
return getpass.getuser()
# 类型检查
class Foo(HasTraits):
bar = Int()
foo = Foo(bar='3') # raises a TraitError

其中这里有一个getpass模块,其提供了可移植的密码输入。主要提供了两个函数getpassgetuser

  • getpass(prompt='Password: ', stream=None)

    提示用户没有回显的输入密码。Unix上,提示符被写入到文件对象流中,如果需要会使用替换的错误处理。流默认会输入到控制终端/dev/tty,如果不可用会到sys.stderr

  • getuser()

    返回用户的登录名,诸如LOGNAME, USER, LNAME, USERNAME的环境变量。

observe

Traitlets实现了观察者模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Foo(HasTraits):
bar = Int()
baz = Unicode()
foo = Foo()
def func(change):
print(change['old'])
print(change['new'])
# 需要观察的变量是bar,用func来处理观察改变事件
foo.observe(func, names=['bar'])
foo.bar = 1 # prints '0\n 1'
foo.baz = 'abc' # prints nothing

如果观察者是类的方法,那么可以使用装饰器语法

1
2
3
4
5
6
7
8
9
class Foo(HasTraits):
bar = Int()
baz = Unicode()
# 观察变量bar
@observe('bar')
def _observe_bar(self, change):
print(change['old'])
print(change['new'])

Validation

在trait类中自定义验证逻辑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from traitlets import HasTraits, TraitError, Int, Bool, validate
class Parity(HasTraits):
value = Int()
parity = Int()
@validate('value')
def _valid_value(self, proposal):
# 期望的值
if proposal['value'] % 2 != self.parity:
raise TraitError('value and parity should be consistent')
return proposal['value']
@validate('parity')
def _valid_parity(self, proposal):
parity = proposal['value']
if parity not in [0, 1]:
raise TraitError('parity should be 0 or 1')
if self.value % 2 != parity:
raise TraitError('value and parity should be consistent')
return proposal['value']
parity_check = Parity(value=2)
with parity_check.hold_trait_notifications():
parity_check.value = 1
parity_check.parity = 1

hold_trait_notifications上下文管理器被释放的时候,如果有验证错误发生,那么改变就会恢复到最初的状态。

最后,trait类型可以有除了trait改变之外其他的事件。在一个类中如果有值的改变那么就可以触发通知。

Instance

class traitlets.Instance(klass=None, args=None, kw=None, **kwargs)

A trait whose value must be an instance of a specified class.

The value can also be an instance of a subclass of the specified class.

Subclasses can declare default classes by overriding the klass attribute

Config

1
2
class Config(dict):
"""An attribute based dict that can do smart merges."""

后记

关于Traitlets就先总结于此,若有更深入的再补充。