什么行为首选? (嵌入Python)

时间:2010-02-12 13:36:27

标签: python

我将Python嵌入到应用程序中。 MyClass.namestr类型的属性:

>>> foo = MyClass()
>>> foo.name
'Default Name'

我应该允许用户这样做:

>>> foo.name = 123
>>> foo.name
'123'
是不是?

>>> foo.name = 123
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: name must be a string

2 个答案:

答案 0 :(得分:4)

绝对提高TypeError而不是试图自动胁迫。通常情况下我会保守地说某些东西是“pythonic”或者不是 - 这是其中一个真正意味着“说话者认为这很好”的词 - 但如果它意味着任何东西,它必须引用{{3在这种情况下,它的格言12:“面对模棱两可,拒绝猜测的诱惑。”

现在,你只是在看整数,但浮点数,adhering to the Zen of PythonDecimal是什么?您使用的是str还是repr?如果您有Decimal实例,那么正确的字符串值是“十进制('10')”还是“10”? Python中的元组,列表,字符串,字节,数组,dicts和所有其他内置类型怎么样?你还不知道的用户定义类型怎么样呢?因为它们是尚未编写的程序的一部分而无法知道呢?

你的库不太可能具有奇怪的自动行为,这会使人们习惯Python的惯例。 (格言8:“特殊情况不足以破坏规则。”)但是,如果这真的提高了图书馆的可用性,你觉得你可以轻松地回答所有这些问题用户可能分配的任意类型,然后继续进行魔法强制。 (格言9:“虽然实用性胜过纯洁。”)但它确实是一个非常罕见的图书馆确实需要这种行为,如果你这样做,请记录下来,以便当它做出令人惊讶的事情时,你的用户(或者甚至可能只是你自己!)可以回过头来阅读具体的规则。

答案 1 :(得分:1)

这实际上取决于你想要达到的目标。我认为最好的解决方案是允许任何对象,可以强制转换为字符串,然后使用python属性。

class MyClass(object):

  def set_name(self, name):
    self._name = str(name)
  def get_name(self):
    return self._name
  name = propert(get_name, set_name)