我创建了一个帮助方法来检查国家/地区的邮政编码格式。因为我有多个邮政编码(例如访问,邮政),我想使用这个帮助方法。 当我调试时,我可以看到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
答案 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