带有默认参数的Python函数参数

时间:2019-02-02 05:43:43

标签: python

我是python的新手。我想定义与fromto日期的功能。如果我使用一个参数调用该函数,则应将该参数作为to日期。如果我通过两个参数,它应该分配fromto日期。

我定义如下,

def __init__(self,fdate="",edate):
        self.fdate = fdate
        self.edate = edate

我收到以下错误,

    def __init__(self,fdate="",edate):
                ^
SyntaxError: non-default argument follows default argument

我了解错误。但我怎么能定义函数,我在Python需求量的?

6 个答案:

答案 0 :(得分:1)

必需的参数必须出现在默认参数,否则蟒蛇不知道哪一个数值是为。

请参见Dive into python section on default and named arguments

答案 1 :(得分:0)

作为错误消息指出,默认参数应遵循非默认的,是这样的:

def __init__(self, edate, fdate=""):
    self.fdate = fdate
    self.edate = edate

请参阅docs,其中清楚地描述了此行为。

答案 2 :(得分:0)

  

语法错误:非默认参数如下默认参数

您的默认参数必须晚一点到非默认参数。

原因:如果您混淆了,解释器将很难分配参数。因此,它不支持它并抛出一个SyntaxError。

只需将其更改为

import quandl
quandl.ApiConfig.api_key = 'gyX6Yqxx3xT3hsdSmPva'
data = quandl.get("EOD/MSFT")
data

@ Edit1 :很少有类似Kotlin的语言允许您在非默认args之前拥有默认args。在这种情况下,您将使用命名的arg设置函数参数。

答案 3 :(得分:0)

传递值默认参数时,其右侧的所有参数也应具有默认值。

C ++也是如此。

例如:

<强>有效 def example(a = 1, b = 2):pass
有效 def example(a , b = 2):pass

错误 def example(a = 1, b):pass

答案 4 :(得分:0)

这是我要解决的方法:我将编写一个小类和两个工厂函数来调用类构造函数并返回结果:

class DateRange:
    def __init__(self, dfrom='', dto=''):
        self.dfrom = dfrom
        self.dto = dto

def date_from_to(dfrom, dto):
    return DateRange(dfrom, dto)

def date_to(dto):
    return DateRange(dto=dto)

从错误消息中可以看到,您无法定义一个以所需方式运行的函数。如果您使用两个功能,则很容易将它们记录下来并记住如何使用它们。

答案 5 :(得分:0)

您可以获得所需的功能,但是它的时间要长得多,如果要添加参数,它将很难维护。您可以捕获所有参数和关键字参数,然后决定如何处理它们:

class Test:
    def __init__(self, *args, **kwargs):
        self.__args, self.__kwargs = args, kwargs
        self.edate = ""
        self.fdate = ""

        # Sanity checking the arguments
        if len(args) + len(kwargs) < 1:
            raise ValueError('Too few arguments.')
        if len(args) + len(kwargs) > 2:
            raise ValueError('Too many arguments.')
        if any(i not in {'edate', 'fdate'} for i in kwargs):
            raise ValueError('Unrecognized keyword arguments.')
        if 'edate' not in kwargs and len(args) < 1:
            raise ValueError('"edate" must be defined either by a keyword'
                             ' argument or by passing an argument.')

        if kwargs.get('edate'):
            self.edate = kwargs['edate']
        if kwargs.get('fdate'):
            self.fdate = kwargs['fdate']

        if len(args) == 2:
            self.fdate = args[0]
            self.edate = args[1]
        elif len(args) == 1:
            if not self.edate:
                self.edate = args[0]
            else:
                self.fdate = args[0]

    def __repr__(self):
        args = ', '.join(str(i) for i in self.__args)
        kwargs = (', '.join(f'{key}={repr(value)}' 
                  for key, value in self.__kwargs.items()))
        return (f'Test({args}, {kwargs}) ->'
                f' self.fdate={repr(self.fdate)},'
                f' self.edate={repr(self.edate)}')

print(Test(1, 2))
print(Test(1))
print(Test(1, edate=3))
print(Test(1, fdate=3))
print(Test(edate=4))

# Will raise exceptions:
#print(Test())
#print(Test(fdate=3))
#print(Test(1, 2, fdate=3))
#print(Test(1, 2, 3))
#print(Test(cdate=4, edate=1))

输出:

Test(1, 2, ) -> self.fdate=1, self.edate=2
Test(1, ) -> self.fdate='', self.edate=1
Test(1, edate=3) -> self.fdate=1, self.edate=3
Test(1, fdate=3) -> self.fdate=3, self.edate=1
Test(, edate=4) -> self.fdate='', self.edate=4