跳转至

Python

介绍

此扩展可以将 Python 代码交给 Adapter 执行(eval),并获取结果。

hello world

打开 Scratch Python 插件

在 Scratch Python 插件里使用 插件启停积木 启动 CodeLab Adapter Python 插件。

执行 Python 代码:

积木说明

暂无

进阶

使用技巧

自定义积木

你可以在插件中添加新的类,来自定义新功能, 我们做了一个范例: PyHelper 源码。你可以使用 PyHelper.open_url("https://www.codelab.club")来为 Scratch 引入打开网页的功能。

你甚至可以更进一步,在 Scratch 中自定义积木!不需要编程 JavaScript,通过 Python 来扩展 Scratch!让我们构建一个打开网页的积木(Scratch本身没有打开网页的功能):

点击制作新的积木:

制作自定义积木,添加输入项目: url 参数.

接下来我们开始定义这个积木的功能,完成之后我们就可以使用它了

以上例子的功能是按下空格,打开 CodeLab 主页。

你可以在插件里添加更多的类似PyHelper的自定义类,来为 Scratch 引入更多新的能力,使用 Python 就行!

与网络交互(requests)

考虑到网络极为强大,Python 插件允许用户在 Scratch 中直接与 requests 交互(只支持表达式,形如requests.get(...), requests.post(...))。

由于 requests 的 API 极为漂亮(支持链式风格),你几乎可以单个表达式中干绝大多数的事情!

requests 文档

一些典型的用例包括:

demo
requests.get("http://httpbin.org/get")
# 链式写法
requests.get("http://httpbin.org/get").text
requests.get("http://httpbin.org/get").json()

# 携带参数
requests.get("http://httpbin.org/get", params={"name": "codelab"})

# post
requests.post('http://httpbin.org/post', data = {'key':'value'})
一些奇怪的想法
  • 通过与带有存储能力的 API 结合,可以构建出类似云变量这种东西

项目链接

文件储存案例

再来做一个例子,@HansonXie 给我写了封邮件,说想写一个extension或者node来进行文件存储,希望用Python来做,而不是Javascript。在此我写个简单例子

我们可以使用 Jupyterlab 编辑extension_python.py. 在其中增加一个新的助手类,来负责存储文件

class StorageHelp:
    def save_text_to_file(text, filename):
        with open(filename, "w"):
            filename.write(text)

之后,将其添加到eval中(使其可用)。

eval(code, {"__builtins__": None}, {
                "PyHelper": self.PyHelper,
                "StorageHelp": StorageHelp()
            })

完成后,重新勾选extension_python.py(stop and start,不需要重启 Adapter)。

此次,自定义的积木,包括两个参数:存储的文本(text) 和 文件名(filename)

提醒

注意文件名和内容都是字符串,有引号"xxxxx"

点击运行新的积木, 在jupyterlab中,可以看到新创建的文件已经在 extensions 目录里

FAQ

如何工作

提醒

exec 可能带来各种安全风险,此外,eval也更符合我们采用的对象/消息隐喻。
如果你确实需要exec,可以自行构建插件, 参考python_exec.py

内置在 Adapter 里的 Python 插件以 eval 执行 Python 代码(只能执行表达式),如果你希望以功能更轻大的 exec (可执行任何 Python 语句)执行 Python 代码,可以在插件市场里下载 extension_python_exec 插件

关于 eval 和 exec 的区别,参考:

我们之没有将 extension_python_exec 内置在 Adapter 中,而是希望用户在需要时自行下载,因为它的功能过于强大,可能会带来一下风险,所以选择权交由使用者。强大的能力通常会伴随风险,当然我们不会做太多限制,由你决定:)

参考