我将Python嵌入到应用程序中。 MyClass.name
是str
类型的属性:
>>> 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
答案 0 :(得分:4)
绝对提高TypeError
而不是试图自动胁迫。通常情况下我会保守地说某些东西是“pythonic”或者不是 - 这是其中一个真正意味着“说话者认为这很好”的词 - 但如果它意味着任何东西,它必须引用{{3在这种情况下,它的格言12:“面对模棱两可,拒绝猜测的诱惑。”
现在,你只是在看整数,但浮点数,adhering to the Zen of Python或Decimal是什么?您使用的是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)