簡體   English   中英

如何向RepoSurgeon添加新功能(就像dsc或amp或min一樣)

[英]How to add a new function to RepoSurgeon (just like dsc or amp or min)

這是以下內容的專門版本: 如何通過exec和eval替換RepoSurgeon的現有Python類方法(或以其他方式擴展)?

如何使用exec工具(即,無需編輯上游代碼)向RepoSurgeon添加新功能來添加新功能,從而增強現有功能。

問題:如果您正在使用RepoSurgeon,並且從腳本或在命令行上調用函數,並且該函數引發異常,則將引發嵌套函數調用。

示例:您要在單個函數中按分支名稱查找分支上的所有化石。 以下復合命令將對名為BRANCH的分支執行此工作:

@dsc(@min(/BRANCH/)) list

如果BRANCH存在,則可以正常工作。 但是,如果沒有呢? 在這種情況下,RepoSurgeon會很生我們的氣,並拋出異常:

@dsc(@min(/NO_SUCH_BRANCH/)) list
[...]
ValueError: min() arg is an empty sequence

問題是這意味着您的整個舉升腳本將脫軌。

該怎么辦?

也許最簡單的解決方案之一是編寫自己的函數並捆綁@dsc(@min(...))的調用序列,同時防止出現異常。

假設您有一個提升腳本,請將以下here-doc作為自變量嵌入到exec

exec <<EOF
    if self:
        def brpdsc_factory(recov):
            Recoverable = recov
            def brpdsc_handler(self, subarg):
                if not subarg:
                    raise Recoverable("function @brpdsc() called with selection that resolves to empty set")
                minset =      set([])
                descendants = set([])
                try:
                    minset = self.min_handler(subarg)
                except ValueError as e:
                    raise Recoverable("invalid value passed to function @min()")
                try:
                    descendants = self.dsc_handler(minset)
                except:
                    raise Recoverable("the implicit call to @dsc() failed")
                return descendants
            return brpdsc_handler
        brpdsc_handler = brpdsc_factory(Recoverable)
        setattr(self, 'brpdsc_handler', brpdsc_handler.__get__(self, self.__class__))
EOF

brpdsc_handler本地函數brpdsc_handler植入為與brpdsc_handler類同名的class RepoSurgeon ,並使函數@brpdsc立即可用於腳本或命令提示符。

存在工廠函數以保留Recoverable的名稱,該名稱是reposurgeon腳本中定義的異常類,但在exec完成后不再可用於我們的代碼。 其他符號可以相同的方式攜帶。

現在所有可能發生的就是我們收到:

reposurgeon: function @brpdsc() called with selection that resolves to empty set

嘗試運行@brpdsc/NO_SUCH_BRANCH/) list后從RepoSurgeon @brpdsc/NO_SUCH_BRANCH/) list

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM