2012-08-30 76 views
0

我正在擴展一個開放源碼的python產品,但我無法直接更改代碼,因爲這會使上游更改變得更加困難。在python中更改函數或方法中的局部變量

所以不是直接改變函數,而是想從另一個地方操作函數內部的局部變量。我想添加一個關鍵字作爲局部變量在函數內創建的字典。我將如何能夠改變這個本地dic變量?這可能嗎?

採取爲例下面的代碼:

import functools 
class API(object): 

    def update_resources(self, host): 
     bla = sflkj 
     dic = { 
      'cpu': 5, 
      'memory': 500 
     } 

class APIExtension(API): 
    def update_resources(self, host): 
     # But first do our changes to the function here 
     # The change that I want to do is add a key: 'workload' 
     # this is the function I want to change the dic variable to include workload 
     super(APIExtension, self).update_resources 
+2

「......這將使合併上游變化更難」。這就是git的用途。或者提供一個補丁來外化變量。 –

+0

如果你偏離上游太多並直接在上游文件中更改所有內容,你將無法輕鬆應用補丁和櫻桃選擇。這是關於openstack的,它提供了一種擴展apis的方法,所以我們創建了自己的API擴展,這是建議的方式。我們現在可以輕鬆地合併錯誤修復,而無需始終手動應用修補程序,因爲文件不再匹配。我同意你的看法,它是一個很好的觀點。 + 1ed它。 –

+0

你不能操縱局部變量,但你肯定可以操縱結果。由於我假設局部變量被使用和應用在代碼中的某個地方,它不僅具有局部範圍,您可能想要在那裏「掛鉤」。但沒有更多細節,很難幫助你。另一種選擇是覆蓋update_resources completeley,而不調用super。 – schacki

回答

2

你不能。如果變量對於函數來說是本地的,那麼除非函數正在執行,否則它不存在。即使可以,管理這種黑客攻擊比管理對庫的自定義更改(或者要求庫開發人員更改它以使變量可訪問)更容易。

2

創建一個補丁併發送給庫作者。他們會將其應用到他們的代碼庫,並感謝您的參與。只需以可配置的方式進行操作即可 - 例如添加創建該字典的新方法,以便擴展。然後,您可以在您的子類中重寫該新方法,並且該修補程序不會針對您的項目。

如果圖書館所有者合併了您的修補程序,那麼只要它被髮布,您就可以使用更新版本的圖書館。

0

正如Ignacio Vazquez-Abrams所說,這就是Git的目的,並且似乎是最好的建議。但不是對這個問題的回答。我仍然希望讓其他用戶看到這一點,如果它們與

目前,我們正在使用Git底墊中掙扎,因此,當一個新的版本出來,我們只是做一個git

git checkout our_changes_to_upstream_branch 
git rebase -i upstream/master 

我們的經修改分支。這將顯示我們已完成的提交列表,並讓我們手動選擇不再需要的提交。之後,它將刪除我們的更改並將其臨時保存到git中的某個位置,然後與上游一起快速前進,在最新版本的上游之後,它會在最新版本之上重播我們的更改。如果存在衝突,它將停止,您可以指定是否要手動合併或跳過。

通常在這一點上,如果存在衝突,我們只需跳過它並創建一張到原始提交作者的票據,以製作新的修補程序並查看是否仍然需要該修補程序。

我們注意到大部分補丁都需要重寫,但這是最簡單的方法。如果有任何改進,很高興聽到他們!

相關問題