2010-02-12 75 views
3

我将Python嵌入到应用程序中。 MyClass.namestr类型的属性:什么行为是首选? (嵌入Python)

>>> 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

这**完全**取决于您的应用程序 – 2010-02-12 13:41:03

+0

我正在寻找* pythonic *的方式来做到这一点。有没有? – 2010-02-12 13:46:37

+0

这是超越* pythonic *的方式 – SilentGhost 2010-02-12 13:55:42

回答

4

绝对提高TypeError而不是尝试自动强制。通常情况下,我会保守的说某件事是“pythonic”或不是 - 它是其中一个真正意思是“说话者认为这很好”的词 - 但如果它意味着任何事情,它必须参考adhering to the Zen of Python,并且在这种情况下,它是格言12:“面对模糊性,拒绝猜测的诱惑。”

现在,你只是看整数,但浮点数或Decimal s或Fraction s?您是使用str还是repr?如果您有Decimal实例,那么正确的字符串值是“十进制('10')”还是“10”?那么Python中的元组,列表,字符串,字节,数组,字节和所有其他内置类型呢?那些你还不知道的用户定义类型又怎么样?因为它们是尚未写入的程序的一部分,所以不可能知道。

你的图书馆不太可能有足够的特性来产生奇怪的自动行为,这会使人们习惯于Python的约定。 (格式8:“特殊案例不足以打破规则。”)然而,如果这真的提高了图书馆的可用性,您可以轻松回答所有这些问题,用户可能会分配,然后继续进行神奇的强制操作。 (格言9:“虽然实用性胜过纯洁”)但是,这确实是一种非常罕见的库,它确实需要这种行为,如果你确实需要这样做,那就记录下来,以便当它出乎意料地发生时,你的用户(甚至可能只是你自己!)可以回头阅读具体的规则。

+2

如果文档足够清楚需要传递什么,以及在传递非字符串时会发生什么,我没有看到任何理由相互比较。 – SilentGhost 2010-02-12 14:13:11

+0

如果列表可以接受任何迭代,为什么goodrone属性不能接受任何可以被强制转换为字符串的对象?这里有什么猜测或含糊之处? – gruszczy 2010-02-12 15:13:06

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) 
相关问题