簡體   English   中英

在Python的__init__中使用* args和** kwargs的SyntaxError

[英]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 ,而其余​​的argskwargs用於初始化RecurringIntervalself.rrule

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM