【问题标题】:Python: Any way to declare constant parameters?Python:有什么方法可以声明常量参数?
【发布时间】:2011-03-06 02:51:14
【问题描述】:

我有一个方法:

def foo(bar):
   # ...

有没有办法将bar 标记为常量?如“bar中的值不能改变”或“bar指向的对象不能改变”。

【问题讨论】:

  • 引用总是const,但值不是(你不能改变bar指向的东西,但如果bar是可变的,你仍然可以改变它的值)。当然,这不是真的正确的,因为您可以欺骗父母的堆栈框架并更改bar 指向的内容,但假设您不诉诸这种骇客,则该规则通常适用.
  • @NickBastin:什么? bar = "changed!" -- 我刚刚将 bar 'points' 更改为(分配给,正确)。
  • @EthanFurman:不完全是。我的观点是,您不能更改父堆栈框架中 bar 引用的内容 - 您当然可以在本地分配名称 bar 以隐藏您传入的对象,但该对象仍然存在并且在父母。
  • 也许你可以称它为bar_constantBAR。这应该向任何查看您的代码的人表明他们不应该重新分配该名称。因此,您已将其标记为常量。你真的不能做更多的事情。

标签: python constants language-construct


【解决方案1】:

如果 bar 是一个不可变对象,bar 在函数执行期间不会改变。

您也可以创建自己的常量对象。 The recipe here.

【讨论】:

  • 请注意,拦截修改本身并不能解决问题。你怎么知道客户端代码不会遇到 ConstError?只有经过充分的测试。
  • bar = 0 -- 我刚刚更改了 bar(bar 分配给的原始对象仍然不受影响)。
【解决方案2】:

没有。

有什么意义?如果您正在编写函数,难道不是由 来确保bar 不会改变吗?或者如果你在调用函数,谁在乎?

【讨论】:

  • 这通常是一个有用的政策问题 - 您正在告知用户您的功能存在限制。当然,这在 Python 中没有原型那么有意义,也没有静态编译器来强制执行约束。
  • 重点是帮助程序员尽可能避免犯错。否则,我们都会在汇编中编写所有内容。
  • @Jeremy Friesner:在 Python 中,“正确”的做法是写一条评论。
  • cmets 的问题在于语言没有强制执行它们。因此,他们不仅不会检测或报告问题,还可以主动阻止读者看到问题,如果读者看到评论并认为它是真的,而实际上不是。
  • @Jeremy Friesner:当 Python 甚至不允许类型声明时,为什么还要允许声明不变性?类型声明也将“帮助程序员避免错误”,但它在 Python 中也被避开了。依赖测试,而不是声明。
猜你喜欢
  • 1970-01-01
  • 2010-11-12
  • 1970-01-01
  • 1970-01-01
  • 2015-08-19
  • 2014-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多