2016-02-06 173 views
0

我对Python非常陌生,所以我认为我正在做一些非常错误的事情,但我没有看到什么,Google也没有帮助过这么多。这有什么问题?将构造函数参数传递给生成默认值的函数失败

def lookup_permille(name): 
    # TODO: implement a permille lookup table 
    return 0 

def lookup_known_product(name): 
    # TODO: implement a known product lookup table 
    return 0 

class ProductEntry: 
    def __init__(self, source, name, price, volume, permille = lookup_permille(name), known_product_id = lookup_known_product(name), category = 0): 
     self.source = source 
     self.name = name 
     self.price = price 
     self.volume = volume 
     self.permille = permille 
     self.price_per_permille = self.permille/self.price; 
     self.category = category 
     self.known_product_id = known_product_id 

调用的ProductEntry构造失败:定义函数时

def __init__(self, source, name, price, volume, permille = lookup_permille(name), known_product_id = lookup_known_product(name), category = 0): 
NameError: name 'name' is not defined 

回答

1

定义默认参数的表达式求值,而不是当它被调用。在定义__init__时,name不存在,因此它不能用于表达式中以计算默认参数。

执行此类操作的常用方法是将备用值作为默认参数,并将其替换为您在函数体内实际需要的任何值。

def __init__(self, source, name, price, volume, 
      permille=None, known_product_id=None, category=0): 
    if permille is None: 
     permille = lookup_permille(name) 
    if known_product_id is None: 
     known_product_id = lookup_known_product(name) 
    ... 
+0

谢谢,我想我期待从Python的太多:d我的意思是,这将不是在C++的工作,由于某种原因我预想的Python是一个神奇的“做它,所有的”啄:d –

相关问题