這個問題在這里已經有了答案: 得到一系列串列的笛卡爾積? (17 個回答) 11 小時前關閉。
假設我有一個 Python 程式,它接受約 40 個用戶輸入并回傳對其壽命的預測。用戶輸入主要是分類的或有限的,例如性別、吸煙狀況和出生年份。
我想通過測驗每個欄位的所有可接受值來最大化我的測驗用例,例如sex:['Male', 'Female', None]
. 有沒有不使用數十個嵌套for
回圈的好方法?例如,一個itertools
函式。我正在考慮類似 scikit-learn 的網格搜索,您可以在其中列出可接受的值,并通過檢查所有可能的組合來啟動超引數優化
我想避免:
for sex in ['male', 'female', None]:
for smoking_status in ['smoker', 'non-smoker', None]:
for birth_year in [1900, ..., 2022, None]:
assert(myfunc(sex, smoking_status, birth_year) == trueOutput)
假設trueOutput
是動態的并且總是給出正確的值(我計劃將 Python 輸出交叉參考到 Excel 電子表格,并為每個測驗用例重寫 Excel 輸入以獲得更新的輸出)。我還計劃將每個可能的測驗用例寫入JSON
代表特定用戶資料的檔案中,這樣我就可以測驗失敗的用例
uj5u.com熱心網友回復:
你想像這樣使用itertools.product
:
sex = ['m', 'f', None]
smoking = ['smoker', 'non-smoker', None]
birth = [1999, 2000, 2001, None]
for item in itertools.product(sex, smoking, birth):
print(item)
要將引數傳遞給您的函式,請使用擴展運算子:
sex = ['m', 'f', None]
smoking = ['smoker', 'non-smoker', None]
birth = [1999, 2000, 2001, None]
for item in itertools.product(sex, smoking, birth):
assert myfunc(*item) == trueOutput
# or
for se, sm, b in itertools.product(sex, smoking, birth):
assert myfunc(se, sm, b) == trueOutput
uj5u.com熱心網友回復:
itertools.product()
正是您想要的,但是對于附加功能,請將每個選擇收集到一個字典中
category_inputs_mapping = {
"gender": ("male", "female", ..., None),
"birth_year": sorted(2022 - x for x in range(150)),
...
}
然后創建一個為您生成每種可能性的函式
def gen_inputs_mapper(d: Dict):
# opportunity to inspect dict
for values in itertools.product(*d.values()):
# opportunity to assert/inspect values
yield {k: v for k, v in zip(d.keys(), values)}
最后,依次獲取每種可能性及其索引
for index, possibility in enumerate(gen_inputs_mapper(category_inputs_mapping)):
result = myfunc(**possibility) # unpack dict to args
assert result = true_output[index] # nth index from computed sheet
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/440119.html
標籤:Python python-3.x 单元测试 测试 迭代工具
上一篇:SwiftUI強調色彩目標之間
下一篇:模擬時單元測驗協程空指標例外