我在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)
但是会给出一个TypeError,其中 init ()缺少必需的位置参数:
B = times.Time(1,2,3)
C = times.Time(1,2)
有没有办法允许这些传递?
答案 0 :(得分:3)
您可以更改要使用的功能的签名"默认参数" (通常也称为"关键字参数")...
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
的值。通常,库的作者将这些参数设置为位置,因为它们需要 才能使函数/对象按预期工作。
答案 1 :(得分:0)
如果你必须使用位置而不是关键字参数,那么简单的解决方案就是使用* args tuple unpacking解压缩它们。this是一个很好的解释,但简短的版本就是它会让你通过将函数放入一个列表(我认为......可能是一个元组?很确定它是一个列表),你可以使用args
访问
然后你可以为` init 中的所有内容设置默认值,并使用从args列表中提取的内容覆盖该默认值。
- 您也可以考虑让它抛出错误然后再处理它。