2015-08-19 111 views
0

我已經創建了一個輔助方法來檢查某個國家的郵政編碼格式。因爲我有多個郵政編碼(例如訪問,郵政),所以我想使用這個輔助方法。 當我調試時,我可以看到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

那麼這是在一個班?什麼是輸入?你可以給[mcve]? – jonrsharpe

回答

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_obj = 'thefourtheye' 
>>> string_obj.upper() 
'THEFOURTHEYE' 
>>> string_obj 
'thefourtheye' 

正如你在這裏看到,string_obj.upper()返回將所有大寫字母一個新的字符串對象,但原來的對象保持不變。所以你不能改變self.zip的值。

+0

感謝您的快速回復。所以如果我得到這個權利,這將意味着我必須複製這個代碼爲每個單獨的郵政編碼,如果我想它被正確地格式化? –

+0

@JohanVergeer這是解決問題的一種方法。否則,你可以更新'自我。zip'與'postal_code_format'函數中的新字符串對象本身,正如我在更新的答案中所示。 – thefourtheye

0

截至postal_code_format(self, zipcode, country):行把

self.zip = zipcode 

注:沒有必要明確地傳遞郵編國家作爲變量的功能

def postal_code_format(self): 
    country = self.country_id 
    zipcode = self.zip 
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時都會更新self.zip,這是一種副作用) - 無論調用它如何使用格式化的代碼,本例中onchange_zip都會更新self。 zip值。現在,如果其他代碼需要格式化的郵政編碼調用postal_code_format,則不會影響self.zip。

相關問題