問題: 我想知道遞歸地將函數應用於對象中的字符串值而不事先知道它的架構的最pythonic方法嗎?最好以足夠通用的方式使其成爲其他類型操作的可重用組件。遞歸地將函數應用於字符串值的大多數pythonic方式
上下文: 我處理JSON字符串作爲從API請求輸入,使用json.loads()加載它,我想之前或之後的任何的去掉所有空白施加驗證之前對象中的字符串。我更喜歡這個代碼是自適應的,以便模式中的變化不會破壞它。
目前的解決方案:
def strip(obj):
return obj.strip()
def recurse_into(obj, baseaction, basetype=str):
if isinstance(obj, basetype):
return baseaction(obj)
elif isinstance(obj, list):
return [recurse_into(o, baseaction, basetype) for o in obj]
elif isinstance(obj, tuple):
return tuple(recurse_into(o, baseaction, basetype) for o in obj)
elif isinstance(obj, dict):
return dict((k, recurse_into(v, baseaction, basetype))
for (k, v) in obj.items())
else:
return obj
def generate_recurse(baseaction, basetype=str):
def f(obj):
return recurse_into(obj, baseaction, basetype)
return f
def recursive_strip_whitespace(obj):
clean_whitespace = generate_recurse(strip)
return clean_whitespace(obj)
問題與當前的解決方案: 它看起來非常簡潔,這是很難理解正在發生的事情對誰沒有寫它的人,我真的希望有更可讀的方法來做到這一點。或者,這是否真的是最好的?
老實說,這段代碼對我來說看起來很乾淨優雅。如果難以理解,也許更多評論會有所幫助? – recursive
爲什麼不只是'return recurse_into(obj,strip)',而不是「生成」遞歸函數,並將其保存到變量中? – bozdoz
爲什麼不只是使用一個簡單的正則表達式? –