我是python的新手。我想定义与from
和to
日期的功能。如果我使用一个参数调用该函数,则应将该参数作为to
日期。如果我通过两个参数,它应该分配from
和to
日期。
我定义如下,
def __init__(self,fdate="",edate):
self.fdate = fdate
self.edate = edate
我收到以下错误,
def __init__(self,fdate="",edate):
^
SyntaxError: non-default argument follows default argument
我了解错误。但我怎么能定义函数,我在Python需求量的?
答案 0 :(得分:1)
必需的参数必须出现在默认参数,否则蟒蛇不知道哪一个数值是为。
答案 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