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

3

我正在将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
这完全取决于你的应用程序。 - Eli Bendersky
我正在寻找一种Pythonic的方法来做这件事。有吗? - Andrew T
这已经超出了Pythonic的方式。 - SilentGhost
@SilentGhost,为什么?我做错了什么吗? - Andrew T
2
有一种Pythonic的方式;请看下面我的答案。另外,虽然你没有问,但不要嵌入Python。扩展它。实际上,嵌入Python没有什么好处:http://twistedmatrix.com/users/glyph/rant/extendit.html - Glyph
@Glyph,我确实问过这个问题(但由于某种原因忘了表达清楚),谢谢!我现在在考虑将一个不太小的GUI应用程序转换为Python模块,但不幸的是,我是团队中唯一的Python开发人员。 - Andrew T
2个回答

4

一定要引发TypeError而不是尝试自动强制转换。通常情况下,我会保守地说某件事是否符合“Pythonic”的标准 - 这是一个只是意味着“演讲者认为这很好”的词语 - 但如果它有任何意义的话,它必须指的是遵循Python之禅,在这种情况下,它是第12条格言:“面对模棱两可,拒绝猜测的诱惑。”

现在,你只是在看整数,那浮点数呢,或者Decimal,或者Fraction?你是使用值的str还是repr?如果你有一个Decimal实例,正确的字符串值是"Decimal('10')"还是"10"?那Python中的元组、列表、字符串、字节、数组、字典和所有其他内置类型呢?那些你还不知道的用户定义类型呢?它们可能是程序中的一部分,但你永远也无法知道,因为这些程序还没有被编写。

你的库很可能不够特殊,无法产生让人迷惑的自动行为,这会让习惯Python规则的人感到困惑。(格言8:“特殊情况并不足以打破规则。”) 但是,如果这真的可以提高库的可用性,并且你觉得可以轻松回答用户指定任意类型时的所有问题,那么就可以进行神奇的强制转换。(格言9:“实用性优于纯粹性。”) 但真正需要这种行为的库非常罕见,如果确实要这样做,请详细记录,以便在出现意外情况时,用户(甚至仅是你自己!)可以查阅具体规则。


2
如果文档清楚地说明了需要传递什么以及当传递非字符串时会发生什么,我认为没有理由偏好其中之一。 - SilentGhost
如果一个列表可以接受任何可迭代对象,为什么 goodrone 属性不能接受任何可以强制转换为字符串的对象?这里有任何猜测或模棱两可之处吗? - gruszczy

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接