检查是否将参数传递给函数而不检查值

时间:2019-09-09 17:51:17

标签: python python-3.x function parameter-passing

我不确定在Python中是否可行,我想知道,是否有任何方法可以在运行时检查是否将参数传递给Python函数而无需对参数值进行某种检查?

def my_func(req, opt=0):
    return was_opt_passed() # Returns bool 

print(my_func(0)) # Prints False
print(my_func(0, 0)) # Prints True

如果可能的话,在某些情况下这将是更好的选择,因为它减轻了记住和检查前哨值的需要。有可能吗?

5 个答案:

答案 0 :(得分:1)

正如Mark在其评论中所述,典型的约定是使用默认值None。然后,您可以在通话时检查它是否仍然None

def my_func(req, opt=None):
    if opt is None:
        #opt wasn’t passed.
        return False
    #opt was passed
    return True

尽管您想对其他选择进行更多的研究(大多数情况下大多数情况是非常规的),请随时查看these answers

答案 1 :(得分:0)

一种好方法是使用* args或** kwargs。

function Insert() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('3:3').activate();
  spreadsheet.getActiveSheet().insertRowsBefore(spreadsheet.getActiveRange().getRow(), 1);
  spreadsheet.getActiveRange().offset(0, 0, 1, spreadsheet.getActiveRange().getNumColumns()).activate();
  spreadsheet.getRange('F3').activate();
  spreadsheet.getCurrentCell().setFormula('=IF(or(ISNUMBER(D3),ISNUMBER(E3)),sum(F4+D3-E3),"")');
  spreadsheet.getActiveRangeList().setBorder(null, null, null, true, null, null, '#000000', SpreadsheetApp.BorderStyle.SOLID);
  spreadsheet.getRange('B3').activate();
  spreadsheet.getActiveRangeList().setBorder(null, true, null, null, null, null, '#000000', SpreadsheetApp.BorderStyle.SOLID);
  spreadsheet.getRange('B3:F4').activate();
  spreadsheet.getRange('B3').activate();
};

* args收集传递给您函数的尚未枚举的所有位置参数,而** kwargs收集传递给您函数的尚未枚举的所有关键字参数。如果args包含一个位置参数,则假定它是opt,并且必须已通过。否则,如果它在kwargs中,它就被传递了,然后,如果我们在任何地方都找不到它,那么它一定不能被传递。

另请参阅https://docs.python.org/3/tutorial/controlflow.html#keyword-arguments

答案 2 :(得分:0)

一种解决方案是使用装饰器/包装器。它们允许您在运行时与传递给函数的内容进行交互,然后按您认为合适的方式处理所说的事情。考虑以下代码:

def check_keywords(func):
    def wrapper(*args, **kwargs):
        if kwargs:
            print('Keyword was passed!')
        return func(*args, **kwargs)
    return wrapper

@check_keywords
def my_func(req, opt=0):
    print(req)

check_keywords捕获该函数,并且如果它检测到将关键字传递到my_func中,则它会打印一些内容。该打印语句可以转换为所需的任意代码。

例如:

my_func(1)
>>> 1

my_func(1, opt = 1)
>>> Keyword was passed!
>>> 1

答案 3 :(得分:0)

使用装饰器

    def check_opt_passed(methd):
        def m(req, *args, **kwarg):
            # this will check even if opt is passed as positional argument
            # and check if opt is passed not any other keyword
            if args or (kwarg and 'opt' in kwarg):
                print('opt is passed')
            else:
                print('opt is not passed')
            return methd(req, *args, **kwarg)

        return m

    @check_opt_passed
    def my_func(req, opt=0):
        # dummy expression for testing
        return req * opt


    print(my_func(1))           # opt is not passed
    print(my_func(1, 0))        # opt is passed
    print(my_func(1, opt=0))    # opt is passed

答案 4 :(得分:0)

检测参数是否已传递的标准方法是哨兵值;但是,如果您愿意丢失功能签名,可以使用**kwargs

def my_func(**kwargs):
  return 'opt' in kwargs
print(my_func()) #=> False
print(my_func(opt=0)) $=> True