Python 检查特定参数值是否作为kwargs传递的正确方法

Python 检查特定参数值是否作为kwargs传递的正确方法,python,Python,假设我有一个接受可选关键字参数(**kwargs)的函数。我想做三件不同的事情,这取决于:(I)这个参数是随特定值一起传递的,(ii)它是在没有特定值的情况下传递的,(iii)它不是传递的 到目前为止我所拥有的。例如: def myfunc(**kwargs): ... do stuff myfunc(print_job=True) # output: # Incoming print job. myfunc was called. myfunc(print_job=Fal

假设我有一个接受可选关键字参数(**kwargs)的函数。我想做三件不同的事情,这取决于:(I)这个参数是随特定值一起传递的,(ii)它是在没有特定值的情况下传递的,(iii)它不是传递的

到目前为止我所拥有的。例如:

def myfunc(**kwargs):
    
  ... do stuff


myfunc(print_job=True)
# output: 
# Incoming print job. myfunc was called.

myfunc(print_job=False)
# output: 
# No incoming print jobs. myfunc was called.

myfunc()
# output: 
# myfunc was called.
在这种情况下,处理kwargs的正确方法是什么?它是字面意义上的,使用两个if语句检查特定值,如:

def myfunc(**kwargs):
    if 'print_job' in kwargs:
        if kwargs['print_job'] is True:
            #... do stuff
        else:
            # ... do stuff
    else:
        # ... do stuff

或者还有其他更类似python的方法吗?

一种方法是在逻辑中使用keyrerror

def myfunc( **kwargs ): 
        try:     
            # if 'print_job' isn't a key in kwargs this throws an exception.
            if kwargs['print_job'] is True: 
                print( "'print_job' is True" ) 
            else: 
                print("'print_job' is not True but is:", kwargs['print_job']) 
        except KeyError:   # KeyError exception caught here
            print( "'print_job' not in kwargs.") # The no 'print_job' code

这就是“请求原谅而不是许可”的原则。捕获KeyError成为代码逻辑的一部分。

我更喜欢使用“get()”完成这类操作。 它比嵌套的if-else更简单。


或者您可以编写一个helper函数,它将从kwargs返回特定参数的值。 如果您有更多的参数需要查询,这将非常有帮助。然后
def helper(key_list, kwargs):
        # do your stuff
        # or call other functions for execution
        # return something

def myfunc(**kwargs):
        helper(['printjob', 'arg2', 'arg3'], kwargs)

为了安全起见,我会使用dict的
.get()
函数。因为如果打印作业键不存在,它将抛出一个
键错误
。这将使用
if
语句保存。秋千和回旋处。当一起避免错误是如此简单时,为什么要用错误捕捉来请求原谅呢?对于更难/意外的错误,公平竞争。但肯定不是这样。@S3DEV我发布了我处理类似案件的方法。我喜欢现代语言能够轻松捕捉异常的方式。所以
try:假设存在密钥(key);除了:没有符合我的思维方式。在过去,我发现
如果它是OK():do_simple();else:handle_exception()
将异常作为逻辑的一个重要部分,特别是在
异常的_OK
非常复杂的情况下。在这种情况下,许多不同的
if-else
逻辑将起作用,并且易于遵循。我的方法将异常视为逻辑的预期部分,而不是错误。
def helper(key_list, kwargs):
        # do your stuff
        # or call other functions for execution
        # return something

def myfunc(**kwargs):
        helper(['printjob', 'arg2', 'arg3'], kwargs)