如何使用非默认参数的值作为Python中默认参数的默认值?

时间:2012-08-03 12:54:14

标签: python default-value default-arguments

这是我的班级栏:

class Bar:
    def __init__(self, start, end, open, volume, high=open, low=open, last=open):
        self.start = start
        self.end = end
        self.open = open
        self.high = high
        self.low = low
        self.last = last
        self.volume = int(volume)

    def __str__(self):
        return self.start.strftime("%m/%d/%Y\t%H:%M:%S") + "\t" + self.end.strftime("%H:%M:%S") + "\t" +str(self.open) + "\t" + str(self.high) + "\t" + str(self.low) + "\t" + str(self.last) + "\t" + str(self.volume)

1)我试图将open,low和last初始化为open。这是正确的方法吗?

2)当我打印(str(bar))时,我得到了有趣的输出,如...

03/13/2012 12:30:00 13:30:00 138.91 <built-in function open> 138.7 <built-in function open> 13177656

5 个答案:

答案 0 :(得分:5)

如果您已将函数编写为

def __init__(self, start, end, foo, volume, high=foo, low=foo, last=foo):
    self.start = start
    self.end = end
    self.open = foo
    self.high = high
    self.low = low
    self.last = last
    self.volume = int(volume)

你会得到一个NameError抱怨没有定义名称foo。这是因为参数的默认值不能引用另一个参数,当您尝试获取其值时,该参数尚未定义。 (默认值在定义方法时设置,而不是在调用方法时设置。)

但是,open是Python中的内置函数,因此定义的;它只不是你想要的open。正确的方法可能是

class Bar:
    def __init__(self, start, end, open, volume, high=None, low=None, last=None):
        self.start = start
        self.end = end
        self.open = open
        self.high = open if high is None else high
        self.low = open if low is None else low
        self.last = open if last is None else last
        self.volume = int(volume)

此外,您可能希望使用'open_'而不是'open'作为参数名称,以避免混淆(并暂时遮蔽)内置函数。

答案 1 :(得分:3)

你知道,open是用于打开文件的内置Python函数吗?也就是说,您要为变量分配method

答案 2 :(得分:2)

这不起作用。

在解析函数时,默认参数将完全评估一次。这意味着必须具有值:方法签名中的其他形式参数没有值。它们更像是占位符。因此,不可能做你想做的事。

Python将搜索一个名为open的预先存在的标识符,在执行该函数时,始终将当前表示的对象分配给变量highlow

答案 3 :(得分:2)

我认为你不能那样做。你有输出,因为“open”内置函数open()被认为是。如果不是打开而是使用其他名称,则会收到错误。

如果低,高和最后不能是无,你可以这样做:

class Bar:
def __init__(self, start, end, open, volume, high=None, low=None, last=None):
    self.start = start
    self.end = end
    self.open = open
    self.high = high if high is not None else open
    self.low = low if low is not None else open
    self.last = last if last is not None else open
    self.volume = int(volume)

答案 4 :(得分:1)

在:

def __init__(self, start, end, open, volume, high=open, low=open, last=open)

open指的是内置open方法。将方法作为参数传递在某些情况下非常有用,例如:max(sequence, key=itemgetter(2)),其中需要可调用。

我怀疑您要将highlowlast默认为传递给open的{​​{1}}的值,在这种情况下,我是d使用关键字参数。

__init__

可替换地:

def __init__(self, start, end, open, volume, **kwargs):
    for k in ('high', 'low', 'last'):
        setattr(self, k, kwargs.get(k, open))

我也不会将def __init__(self, start, end, open, volume, high=None, low=None, last=None): if high is None: self.high = open # etc... 用作名称......