如何解决‘cannot initialize variable with None; optionals are explicit’变量初始化错误
如何解决‘cannot initialize variable with None; optionals are explicit’变量初始化错误
嘿,我来帮你搞定这个问题!这个错误提示其实是TakeProfit的Indie Script在跟你说:“别直接用None初始化变量哦,可选类型必须明明白白声明出来~”
为什么会出现这个错误?
Indie Script虽然看起来和Python很像,但它有自己严格的类型规则,不像普通Python那样允许你随便用None当默认值。它要求“可选值”要么用语言专门的空值标识,要么显式告诉编译器这个变量是可选类型。
具体解决方案分两种情况:
情况1:初始化数值类型变量(比如浮点数、整数)
这时候别用None,直接用nan(Not a Number)来表示“空值”就行,就像你代码里已经导入的from math import nan, isnan那样。
举个例子:
错误写法:trend_direction = None正确写法:
trend_direction = nan之后要判断这个变量是否为空的时候,用
isnan()函数:if not isnan(trend_direction): # 这里写你要执行的逻辑情况2:初始化非数值类型变量(比如字符串、自定义对象)
这时候需要显式声明这个变量是“可选类型”,可以用typing模块里的Optional来标注,之后再用None初始化。
比如:from typing import Optional signal_label: Optional[str] = None这样Indie Script就会明白这个变量可以是字符串或者
None,不会再报错啦。
结合你的SuperTrend指标代码来改
假设你原来的代码里有类似初始化趋势变量的错误写法,比如:
@indicator('SuperTrend', overlay_main_pane=True) @param.float('atr_mult', default=1.0, min=0.1, max=10.0, title='ATR Multiplier') @param.int('n_atr', default=4, min=1, title='ATR Period') def super_trend(atr_mult, n_atr): atr = Atr(n_atr) upper_band = nan lower_band = nan current_trend = None # 这里会报错! # ... 其他逻辑
把current_trend = None改成current_trend = nan,然后后续判断用isnan()就没问题了。
另外如果是MutSeriesF这类系列变量,初始化也不能用None,要对应改成nan:
错误写法:
trend_series = MutSeriesF(None)
正确写法:
trend_series = MutSeriesF(nan)
备注:内容来源于stack exchange,提问作者I am just beginner
相关产品推荐
相关产品推荐

