You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PyScript中从HTML单选按钮解析布尔值?

问题:PyScript中单选按钮值无法正确转为布尔值

在PyScript应用的index.html中设置了两个单选按钮,用于控制是否生成重叠的各向同性高斯blob(通过调整Scikit-Learn make_blobs 的cluster_std参数),但无论点击哪个按钮,解析后得到的都是True,导致参数无法正确切换。

相关代码片段

HTML代码

<div id="input" style="margin: 20px;">
  Should the clusters overlap: <br/>
  <input py-click="generate_blobs()" type="radio" id="true" name="overlaps" value="true">
  <label for="true"> True</label>
  <input py-click="generate_blobs()" type="radio" id="false" name="overlaps" value="false">
  <label for="false"> False</label>
</div>

原Python代码(问题点)

def generate_blobs():
    """Generate isotropic Gaussian blobs for clustering"""

    over_laps = js.document.getElementsByName("overlaps")
    for element in over_laps:
        if element.checked:
            # 问题根源:Python中任何非空字符串转bool都会得到True
            overlap = bool(element.value)

            print(overlap, type(overlap))
            
            break
    paragraph = Element("Overlap")
    paragraph.write(f"overlaps: {overlap}")

    n_samples = 4_000  # if overlap else 2_000
    cluster_std = 1.5 if overlap else .4

    X, y = datasets.make_blobs(
            n_samples = n_samples,
            n_features = 2,
            centers = 5,
            cluster_std = cluster_std,
            shuffle = True,
        )

    return X, y

解决方法

问题出在bool(element.value)的转换逻辑:Python中所有非空字符串转换为布尔值时都会得到True,哪怕字符串是"false"。需要改为直接判断字符串内容,或者调整value值的类型。

方案1:直接判断字符串值(推荐)

修改Python中获取overlap的代码,通过字符串匹配来确定布尔值:

if element.checked:
    # 转为小写后判断,避免大小写问题
    overlap = element.value.lower() == "true"

方案2:使用数值型value

修改HTML中单选按钮的value为数值,再转布尔值:

<input py-click="generate_blobs()" type="radio" id="true" name="overlaps" value="1">
<input py-click="generate_blobs()" type="radio" id="false" name="overlaps" value="0">

Python代码中转换:

if element.checked:
    overlap = bool(int(element.value))

方案3:用PyScript的Element API简化获取

利用PyScript内置的Element工具直接获取选中的单选按钮值:

def generate_blobs():
    # 直接获取name为overlaps的选中元素值
    selected_value = Element("overlaps").value
    overlap = selected_value.lower() == "true"
    
    # 后续逻辑不变...

修改后效果

选择"False"选项时,overlap会被正确解析为False,cluster_std会设置为0.4,生成不重叠的聚类。

内容的提问来源于stack exchange,提问作者Gustav Rasmussen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 16:02:40