非标准可选参数默认值
我有两个函数:
def f(a,b,c=g(b)):
blabla
def g(n):
blabla
c
是函数f
中的可选参数。 如果用户未指定其值,则程序应计算 g(b),这将是 c
的值。 但代码无法编译 - 它说名称“b”未定义。 如何解决这个问题?
有人建议:
def g(b):
blabla
def f(a,b,c=None):
if c is None:
c = g(b)
blabla
但这不行。 也许用户希望 c
为 None,然后 c
将具有另一个值。
I have two functions:
def f(a,b,c=g(b)):
blabla
def g(n):
blabla
c
is an optional argument in function f
. If the user does not specify its value, the program should compute g(b) and that would be the value of c
. But the code does not compile - it says name 'b' is not defined. How to fix that?
Someone suggested:
def g(b):
blabla
def f(a,b,c=None):
if c is None:
c = g(b)
blabla
But this doesn't work. Maybe the user intended c
to be None and then c
will have another value.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
如果
None
可以是c
的有效值,那么您可以执行以下操作:If
None
can be a valid value forc
then you do this:你不能那样做。
在函数内部,检查是否指定了 c。 如果不是,请进行计算。
You cannot do it that way.
Inside the function, check if c is specified. If not, do the calculation.
c
的值将在编译时求值 (g(b)
)。 因此,您需要在f
之前定义g
。 当然,您还需要在该阶段定义一个全局b
变量。打印 5.
value of
c
will be evaluated (g(b)
) at compilation time. You needg
defined beforef
therefore. And of course you need a globalb
variable to be defined at that stage too.prints 5.
问题
是哨兵是全局/公共的,除非此代码是函数/方法的一部分。 因此,有人可能仍然可以调用
f(23, 42, sentinel)
。 但是,如果f
是全局/公共的,则可以使用闭包将sentinel
设为本地/私有,以便调用者无法使用它:如果您担心静态代码分析器可能会对
f
产生错误的想法,那么,您可以对工厂使用相同的参数:The problem with
is that
sentinel
is global/public unless this code is part of a function/method. So someone might still be able to callf(23, 42, sentinel)
. However, iff
is global/public, you can use a closure to makesentinel
local/private so that the caller cannot use it:If you are concerned that static code analyzers could get the wrong idea about
f
then, you can use the same parameters for the factory:您可能可以更好地构建它,但这就是主要思想。 或者,您可以使用 **kwargs 并使用诸如 f(a,b,c=Something) 之类的函数,您只需修改 f因此。
文档
You can probably structure it better, but that's the main idea. Alternatively you can use
**kwargs
and use the function likef(a,b,c=Something)
, you just have to modifyf
accordingly.Documentation