如何在 python 中获取少于所需数量的位置参数?
How to take less than the required number of positional arguments in python?
我正在测试 python 中一个程序的框架,该框架评估以 (hh, mm, ss, zz) 形式给出的时间,其中 hh 是小时,mm 是分钟,ss 是秒,并且zz 是与 UTC 的区别。基本上,对于 init 函数,我希望能够在控制台中评估输入并传递它们,而不管它们是否具有正确数量的位置参数。这是我的代码:
class Time(object):
def __init__(self, hh, mm, ss, zz):
'''takes initial time values'''
pass
目前,该程序将使用适当数量的变量将变量输入控制台,如下所示:
A = times.Time(1, 2, 3, 4)
但是 init() 会给出一个 TypeError 缺少这些必需的位置参数:
B = times.Time(1,2,3)
C = times.Time(1,2)
有没有办法让这些通过?
您可以更改函数的签名以使用 "default arguments"(通常也称为 "keyword arguments")...
def __init__(self, hh=None, mm=None, ss=None, zz=None):
这将用 None
值代替未指定的值。
如果不能修改签名,可以使用inspect:
import inspect
def pad_args(func, *my_args):
spec = inspect.getargspec(func)
missing_count = len(spec.args) - len(my_args)
args = my_args + (None,)*missing_count
return func(*args)
你会像这样使用它:
C = pad_args(times.Time, 1, 2)
当然,你在这里的里程可能不会让你走得太远——大多数带有位置参数的函数不能任意接受 None
的值。通常库的作者将这些参数设置为位置参数,因为它们 需要 才能使 function/object 按预期工作。
如果你必须使用位置参数而不是关键字参数,简单的解决方案就是使用 *args 元组解包来解包它们 --- this 是一个很好的解释,但简短的版本是它使任何你将函数传入一个列表(我想......可能是一个元组?很确定它是一个列表)你可以使用 args
访问
然后您可以为 `init 中的所有内容设置默认值,并使用从 args 列表中提取的内容覆盖默认值。
-- 你也可以考虑让它抛出错误然后处理它。
我正在测试 python 中一个程序的框架,该框架评估以 (hh, mm, ss, zz) 形式给出的时间,其中 hh 是小时,mm 是分钟,ss 是秒,并且zz 是与 UTC 的区别。基本上,对于 init 函数,我希望能够在控制台中评估输入并传递它们,而不管它们是否具有正确数量的位置参数。这是我的代码:
class Time(object):
def __init__(self, hh, mm, ss, zz):
'''takes initial time values'''
pass
目前,该程序将使用适当数量的变量将变量输入控制台,如下所示:
A = times.Time(1, 2, 3, 4)
但是 init() 会给出一个 TypeError 缺少这些必需的位置参数:
B = times.Time(1,2,3)
C = times.Time(1,2)
有没有办法让这些通过?
您可以更改函数的签名以使用 "default arguments"(通常也称为 "keyword arguments")...
def __init__(self, hh=None, mm=None, ss=None, zz=None):
这将用 None
值代替未指定的值。
如果不能修改签名,可以使用inspect:
import inspect
def pad_args(func, *my_args):
spec = inspect.getargspec(func)
missing_count = len(spec.args) - len(my_args)
args = my_args + (None,)*missing_count
return func(*args)
你会像这样使用它:
C = pad_args(times.Time, 1, 2)
当然,你在这里的里程可能不会让你走得太远——大多数带有位置参数的函数不能任意接受 None
的值。通常库的作者将这些参数设置为位置参数,因为它们 需要 才能使 function/object 按预期工作。
如果你必须使用位置参数而不是关键字参数,简单的解决方案就是使用 *args 元组解包来解包它们 --- this 是一个很好的解释,但简短的版本是它使任何你将函数传入一个列表(我想......可能是一个元组?很确定它是一个列表)你可以使用 args
然后您可以为 `init 中的所有内容设置默认值,并使用从 args 列表中提取的内容覆盖默认值。
-- 你也可以考虑让它抛出错误然后处理它。