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 极为漂亮(支持链式风格),你几乎可以单个表达式中干绝大多数的事情!
一些典型的用例包括:
- 两个 Adapter 之间的消息通信
- 触发 webhook
- 请求公开的网络 API
- 与自己搭建的 web server 交互
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 结合,可以构建出类似云变量这种东西
- 或者使用 json-server 临时搭建一个
项目链接¶
文件储存案例¶
再来做一个例子,@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 中,而是希望用户在需要时自行下载,因为它的功能过于强大,可能会带来一下风险,所以选择权交由使用者。强大的能力通常会伴随风险,当然我们不会做太多限制,由你决定:)