我不确定在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
如果可能的话,在某些情况下这将是更好的选择,因为它减轻了记住和检查前哨值的需要。有可能吗?
答案 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