假设我将函数myFunc
定义为
def myFunc(value):
return value if isinstance(value, int) else None
现在,在我的项目中,我使用myFunc
,如果从myFunc
返回的值为None,则封闭的函数应自动返回,如果返回某个整数值则应该继续
例如:
def dumbFunc():
# some code
# goes here..
result = myFunc('foo')
# some code
# goes here..
此功能应自动表现为..
def dumbFunc():
# some code
# goes here..
result = myFunc('foo')
if not result:
return
# some code
# goes here..
PS - 我不知道这件事是否可能。
答案 0 :(得分:3)
这根本不可能。
除了异常之外,您无法为被调用函数提供影响调用范围控制流的能力。因此,函数调用foo()
可以永远不会中断控制流而不会抛出异常。作为函数的使用者,您(调用函数)始终有责任自行处理此类情况并决定您自己的控制流程。
这样做是一个非常好的主意。只是函数调用可能会中断我的控制流而没有可能对它做出反应的可能性首先听起来像是一场纯粹的噩梦。仅仅为了释放和清理资源的能力,控制流程不是从我这里获取是非常重要的。
异常是一个值得注意的例外,但当然这是一个根深蒂固的语言特性,还仍然让我有能力对其采取行动(通过捕获异常,甚至通过最终阻止执行清理任务)。例外故意不是沉默,而是非常响亮,因此确定性控制流程的中断清晰可见,并且在正确处理时影响最小。
但是有一个既不提供任何控制也不提供任何反馈的沉默特征只是一个可怕的想法。
如果在我的项目中的100个地方使用
myFunc
,我需要在其后面放置一个if条件。
如果您的代码类似于那样,您只需从任何调用myFunc
的函数中返回任何内容,而无需执行任何,那么您要么构建一个不切实际的幻想项目,要么就是您我们根本不知道这会对以这种方式返回的函数的调用代码产生什么影响。
答案 1 :(得分:1)
有几种方法可以达到这样的效果,但我认为你可能已经找到了最好的方法。
你已经有了这个功能:
def myFunc(value):
return value if isinstance(value, int) else None
我可能会这样做:
def myFunc(value):
return isinstance(value, int)
但无论哪种方式都可以使用它:
def dumb_func():
value = do_something()
if myFunc(value):
return
do_more()
return value
或者,您可以使用try
和except
我会提出一个TypeError
,因为这似乎是你正在检查的内容:
def myFunc(value):
if not isinstance(value, int):
raise TypeError('myFunc found that {} is not an int'.format(value))
然后你可以这样使用
def dumb_func():
value = do_something()
try:
myFunc(value):
Except TypeError as e:
print e # some feedback that this has happened, but no error raised
return
do_more()
return value
对于奖励积分,你可以定义一个自定义异常(这是更安全的,因为当你捕获到特定错误时,你知道它不是由代码中的任何其他东西引发的,如果你这样做,你可能会更懒,例如:)
Class CustomTypeError(TypeError):
pass
def dumb_func():
try:
value = do_something()
myFunc(value):
do_more()
return value
Except CustomTypeError as e:
print e # some feedback that this has happened, but no error raised
return
但是这一切都没有解决这个问题:如果你想根据测试结果采取行动,你必须检查结果。
答案 2 :(得分:0)
Python有一个ternary conditional operator,你使用的语法是正确的,所以这将起作用:
def myFunc(value):
return value if isinstance(value, int) else None
def dumbFunc():
print("Works?")
result = myFunc(5)
print(result)
dumbFunc()
结果:
Works?
5
我希望函数在这种情况下自动返回
这是不可能的。要做到这一点,你必须检查myFunc()
的返回值并对其采取行动。
PS:你可以用goto
语句做到这一点,但幸运的是,doesn't support this functionality。