下記のようなexcel-macroでxlwings経由でpython関数を実行しています。しかしどうあがいても、揮発性関数扱い(Open、Any-cell変化時に再計算)されています。
これまで確認した内容としては、

1) vba側でいきなり0などの値を返す。→これのみ非揮発性に変化

MLMprdct = 0 'Py.CallUDF(Tar_pyfile, "MLMprdct", Array(Model, Labels, Xn, OutRs, OutCs, enslst), ThisWorkbook, Application.Caller)

2) python側で、値をすぐ返す。 → 揮発性のまま

return(Xn[:,:2])#(MLMprd_calc(Mdlfile, Labels, OutRs, OutCs, lst, Xn))

3) XnがRange渡し(python側でvalue化)をValue渡しにしてpython側では一切excelを触らない → 揮発性のまま

vba:

MLMprdct = Py.CallUDF(Tar_pyfile, "MLMprdct", Array(Model, Labels, Xn.value, OutRs, OutCs, enslst), ThisWorkbook, Application.Caller)

python

♯♯@xw.arg('rXn', xw.Range)
♯♯def MLMprdct(Mdlfile, Labels, rXn='', OutRs=1, OutCs=2, lst=''): 
def MLMprdct(Mdlfile, Labels, Xn, OutRs=1, OutCs=2, lst=''): 
    Xn = np.array(Xn) #rXn.resize(OutRs).expand('right').options(np.array).value

「私のxlwings‐UDF関数は非揮発性ですよ」という方いらっしゃいますか? いたら教えていただけないでしょうか?

vba:

Public Function MLMprdct(Model As String, Labels As String, Xn As Range, Optional OutRs As Long = 1, Optional OutCs As Integer = 2, Optional enslst As String = "") 'Private
Application.Volatile (False) 'don't work
sta = Time()
If TypeOf Application.Caller Is Range Then On Error GoTo failed
MLMprdct = Py.CallUDF(Tar_pyfile, "MLMprdct", Array(Model, Labels, Xn, OutRs, OutCs, enslst), ThisWorkbook, Application.Caller)
Debug.Print "MLM:", Application.Caller.Address(, , , True), Time() - sta
Exit Function
 failed:
MLMprdct = Err.Description
 End Function

python:(最上層のみ)

@xw.func
@xw.arg('rXn', xw.Range)
def MLMprdct(Mdlfile, Labels, rXn='', OutRs=1, OutCs=2, lst=''): 
    Xn = rXn.resize(OutRs).expand('right').options(np.array).value
    return(MLMprd_calc(Mdlfile, Labels, OutRs, OutCs, lst, Xn))