![](/img/trans.png)
[英]python create a metaclass which auto __init__ for *args and **kwargs
[英]SyntaxError using *args and **kwargs in an __init__ in Python
我正在嘗試定義一個RecurringInterval
類, dateutil.rrule
使用從dateutil.rrule
到composition的rrule
類,此外還具有屬性period
,默認情況下為None
。 我試圖以這種方式初始化它:
class RecurringInterval(object):
def __init__(self, *args, period=None, **kwargs):
self.period = period
self.rrule = dateutil.rrule.rrule(*args, **kwargs)
recurring_interval = RecurringInterval(dateutil.rrule.DAILY, count=1)
但是,我得到一個SyntaxError
:
File "/home/kurt/dev/scratch/Furion_scheduler/recurring_interval.py", line 7
def __init__(self, *args, period=None, **kwargs):
^
SyntaxError: invalid syntax
據我了解,位置參數應該放在關鍵字參數之前,因此這是我期望的語法; 我該如何糾正? (從https://docs.python.org/2/tutorial/controlflow.html#unpacking-argument-lists尚不明確)。
我試圖使period=None
前進,如下所示:
class RecurringInterval(object):
def __init__(self, period=None, *args, **kwargs):
self.period = period
self.rrule = dateutil.rrule.rrule(*args, **kwargs)
但這會引發TypeError
:
Traceback (most recent call last):
File "/home/kurt/dev/scratch/Furion_scheduler/recurring_interval.py", line 9, in <module>
recurring_interval = RecurringInterval(dateutil.rrule.DAILY, count=1)
File "/home/kurt/dev/scratch/Furion_scheduler/recurring_interval.py", line 7, in __init__
self.rrule = dateutil.rrule.rrule(*args, **kwargs)
TypeError: __init__() takes at least 2 arguments (2 given)
如何以預期的方式初始化RecurringInterval
?
它應該是:
def __init__(self, period=None, *args, **kwargs):
更新的答案
在Python之后,默認關鍵字參數在變長位置參數之后 ,以下代碼在Python 3中有效:
class RecurringInterval(object):
def __init__(self, *args, duration=datetime.timedelta(seconds=0), **kwargs): # Initializing in this way only works in Python 3
self.duration = duration
self.rrule = dateutil.rrule.rrule(*args, **kwargs)
舊答案
在這篇Github文章之后 ,我找到了使用kwargs.pop
的解決方案:
class RecurringInterval(object):
def __init__(self, *args, **kwargs):
self.period = kwargs.pop('period', None)
self.rrule = dateutil.rrule.rrule(*args, **kwargs)
recurring_interval = RecurringInterval(dateutil.rrule.DAILY, count=1, period=datetime.timedelta(days=2))
這樣,將period
作為關鍵字參數給出,將其分配給self.period
,其默認值為None
,而其余的args
和kwargs
用於初始化RecurringInterval
的self.rrule
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.