如何将方法中的值返回到输入值

时间:2015-08-19 13:59:19

标签: python python-2.7 methods return-value

我创建了一个帮助方法来检查国家/地区的邮政编码格式。因为我有多个邮政编码(例如访问,邮政),我想使用这个帮助方法。 当我调试时,我可以看到self.zip被放入值zipcode,但是当它运行时,方法zipcode会更新,但它不会将值返回给self.zip。

有人可以向我解释我是如何让这个工作的吗?

def onchange_zip(self):
    self.postal_code_format(self.zip, self.country_id)

def postal_code_format(self, zipcode, country):
    if country.name == "Netherlands":
        zipcode = zipcode.replace(" ", "").upper()
        if len(zipcode) == 6:
            numbers = zipcode[:4]
            letters = zipcode[-2:]
            if letters.isalpha() and numbers.isdigit():
                zipcode = str("{0} {1}").format(numbers, letters)
            else:
                raise ValueError("Could not properly format the postal code.")
        else:
            raise ValueError("Could not properly format the postal code.")
        return zipcode

3 个答案:

答案 0 :(得分:1)

当你说

zipcode = zipcode.replace(" ", "").upper()

您正在使zipcode引用新的字符串对象。它不再引用self.zip对象。

执行此操作的正确方法是将值重新分配回self.zip,如此

self.zip = self.postal_code_format(self.zip, self.country_id)

或者重新分配postal_code_format函数本身的值,而不是返回,就像这样

self.zip = zipcode

注意:无论如何,String对象是不可变的。这意味着,对字符串对象的任何操作都会为您提供一个新的字符串对象,它们不会修改原始对象。例如,

>>> string_obj = 'thefourtheye'
>>> string_obj.upper()
'THEFOURTHEYE'
>>> string_obj
'thefourtheye'

如您所见,string_obj.upper()返回一个包含所有大写字母的新字符串对象,但原始对象保持不变。因此,您无法更改self.zip的值。

答案 1 :(得分:1)

就个人而言,我建议您在onchange_zip函数中更改一行:

self.postal_code_format(self.zip, self.country_id)

self.zip = self.postal_code_format(self.zip, self.country_id)

如果你采用这种方法,postal_code_format函数只返回一个格式化的邮政编码 - 它没有任何副作用(比如每次调用时更新self.zip,这是副作用) - 并且无论使用格式化代码调用它做什么,在这种情况下onchange_zip都会更新self.zip值。现在,如果其他需要格式化邮政编码的代码调用postal_code_format,它就不会影响self.zip。

答案 2 :(得分:0)

postal_code_format(self, zipcode, country): put

的行
self.zip = zipcode

注意:无需将zipcode和country作为变量显式传递给函数

def postal_code_format(self):
    country = self.country_id
    zipcode = self.zip