![](/img/trans.png)
[英]Can i pass a numpy array as an argument to a function, just like a variable?
[英]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.