โน๊ตบุ๊ค Python ปฏิกิริยาที่แม่นยำสำหรับ Jupyter [Lab]:
pip install ipyflowPython 3 (ipyflow) จากตัวเลือกตัวเรียกใช้หรือเคอร์เนลIpyflow เป็นเคอร์เนล Python รุ่นต่อไปสำหรับ JupyterLab และ Notebook 7 ที่ติดตามความสัมพันธ์ของ DataFlow ระหว่างสัญลักษณ์และเซลล์ในระหว่างเซสชันการโต้ตอบที่กำหนดจึงทำให้เหตุผลเกี่ยวกับสถานะสมุดบันทึกได้ง่ายขึ้น นี่คือวิดีโอของ JupyterCon Talk แนะนำ (และสไลด์ที่สอดคล้องกัน)
หากคุณต้องการข้ามสนามลิฟต์และข้ามตรงไปยังคำแนะนำในการติดตั้ง / เปิดใช้งานกระโดดข้ามไปยังจุดเริ่มต้นอย่างรวดเร็วด้านล่าง มิฉะนั้นให้อ่านต่อไปเพื่อเรียนรู้เกี่ยวกับปรัชญาและชุดคุณสมบัติของ Ipyflow
IpyFlow ให้ปฏิกิริยาแบบ Bolt-On กับเคอร์เนล Python เริ่มต้นของ Jupyter, Ipykernel มันได้รับการออกแบบโดยคำนึงถึงเป้าหมายต่อไปนี้:
B ขึ้นอยู่กับเซลล์ A เนื่องจากการอ้างอิงตัวห้อย x[0] และฉลาดพอที่จะไม่ดำเนินการตามปฏิกิริยา B. เซลล์ B เมื่อบางส่วนของ x , เช่น x[1] , การเปลี่ยนแปลง เป็นผลให้มัน จำกัด การดำเนินคดีอีกครั้งที่ไม่จำเป็นออกเป็นขั้นต่ำในการติดตั้ง Run:
pip install ipyflowในการเรียกใช้เคอร์เนล ipyflow ให้เลือก "Python 3 (Ipyflow)" จากรายการเมล็ดที่มีอยู่ในแท็บ Launcher ในทำนองเดียวกันคุณสามารถเปลี่ยนเป็น / จาก ipyflow จากโน้ตบุ๊กที่มีอยู่โดยการนำทางไปยังรายการเมนูไฟล์ "เปลี่ยนเคอร์เนล":
| จุดเข้า | เคอร์เนลสวิตช์ |
|---|---|
Ipyflow จัดส่งที่มีส่วนขยายที่นำปฏิกิริยามาสู่ JupyterLab และ Notebook 7 โดยค่าเริ่มต้นคล้ายกับพฤติกรรมการดำเนินการที่เสนอในสมุดบันทึกอื่น ๆ เช่นที่สังเกตได้, pluto.jl และ marimo
การเกิดปฏิกิริยาของ Ipyflow นั้นแตกต่างจากด้านบนเล็กน้อยอย่างไรก็ตามเนื่องจากได้รับการออกแบบมาเพื่อตอบสนองความต้องการของผู้ใช้ Jupyter โดยเฉพาะ เมื่อคุณดำเนินการเซลล์ C ด้วย Ipyflow, เอาต์พุตของ C , เอาต์พุตของเซลล์ C ขึ้นอยู่กับและเอาต์พุตของเซลล์ที่ขึ้นอยู่กับ C ทั้งหมดจะปรากฏขึ้นตามที่พวกเขาจะทำถ้าสมุดบันทึกถูกดำเนินการจากบนลงล่าง (เช่น "รีสตาร์ทและวิ่งทั้งหมด") เมื่อคุณเลือกเซลล์ C บางเซลล์ทั้งหมดที่จะทำการ execute อีกครั้งเมื่อ C ถูกดำเนินการมีจุดสีส้มถัดจากพวกเขาและเซลล์ที่ C ขึ้นอยู่กับ แต่มันเป็นที่ทันสมัยและจะไม่ถูก execute มีจุดสีม่วงอีกครั้ง:
ข้อมูลการพึ่งพาเซลล์ยังคงอยู่กับข้อมูลเมตาของโน้ตบุ๊กเพื่อให้คุณสามารถข้ามไปยังเซลล์ใด ๆ หลังจากเริ่มเซสชันเคอร์เนลสดเรียกใช้และมั่นใจว่าผลลัพธ์เป็นสิ่งที่ผู้เขียนโน้ตบุ๊กตั้งใจไว้:
เนื่องจาก ipyflow peeks ที่สถานะรันไทม์เพื่ออนุมานการพึ่งพาจึงจำเป็นต้องเก็บเนื้อหาของโน้ตบุ๊กให้สอดคล้องกับสถานะหน่วยความจำของเคอร์เนลแม้กระทั่งข้ามเบราว์เซอร์รีเฟรช ด้วยเหตุนี้ IpyFlow จึงเปิดใช้งาน AutoSave-on-Change โดยค่าเริ่มต้นเพื่อให้สถานะเคอร์เนล, สถานะในหน่วยความจำของสมุดบันทึกของสมุดบันทึกและไฟล์โน๊ตบุ๊คบนดิสก์ทั้งหมดอยู่ในการซิงค์ หากคุณเขียนทับผลลัพธ์ของเซลล์ที่คุณต้องการเก็บไว้โดยไม่ตั้งใจเช่นในระหว่างการดำเนินการปฏิกิริยาและ autosave เขียนทับผลลัพธ์ก่อนหน้านี้บนดิสก์อย่ากลัว! IpyFlow จัดเตรียมยูทิลิตี้ไลบรารีที่เรียกว่า reproduce_cell เพื่อกู้คืนอินพุตและเอาต์พุตของการดำเนินการของเซลล์ก่อนหน้า (ภายในเซสชันเคอร์เนลที่กำหนด):
from ipyflow import reproduce_cell
reproduce_cell ( 4 , lookback = 1 ) # to reproduce the previous execution of cell 4ตัวอย่าง:
หากคุณต้องการยกเลิกการดำเนินการปฏิกิริยาชั่วคราวคุณสามารถใช้ Ctrl+Shift+Enter (บน Mac, CMD+Shift+Enter ยังใช้งานได้) เพื่อดำเนินการเฉพาะเซลล์ที่เป็นปัญหา:
นอกจากนี้คุณยังสามารถเรียกใช้ Magic Command %flow mode normal ในการยกเลิกโหมดการดำเนินการปฏิกิริยาเริ่มต้น (ซึ่งในกรณีนี้ CTR+Shift+Enter / Cmd+Shift+ENTER จะเปลี่ยนจากการไม่ทำปฏิกิริยาเป็นปฏิกิริยา) ในการเปิดใช้งานการดำเนินการตอบโต้เป็นค่าเริ่มต้นอีกครั้งคุณสามารถเรียกใช้ %flow mode reactive :
หากคุณต้องการป้องกันพฤติกรรมปฏิกิริยาเริ่มต้นสำหรับทุกเซสชันเคอร์เนลใหม่คุณสามารถเพิ่มสิ่งนี้ลงในโปรไฟล์ ipython ~/.ipython/profile_default/ipython_config.py คุณ
c = get_config ()
c . ipyflow . exec_mode = "normal" # defaults to "reactive" Ipyflow เริ่มต้นเป็นความหมาย B การสั่งซื้อ ซึ่งหมายความว่าถ้าเซลล์ B ขึ้นอยู่กับเซลล์ A ดังนั้นจะต้องปรากฏขึ้นก่อน A ในลำดับเชิงพื้นที่ของสมุดบันทึก Ipyflow ไม่ได้ป้องกันเซลล์ก่อนหน้านี้จากการอ้างอิงข้อมูลที่สร้างหรืออัปเดตโดยเซลล์ในภายหลัง แต่จะละเว้นขอบเหล่านี้เมื่อทำการดำเนินการปฏิกิริยา
ความหมายในการสั่งซื้อแม้ว่าจะมีความยืดหยุ่นน้อยกว่า แต่ก็มีคุณสมบัติบางอย่างที่พึงประสงค์เมื่อเปรียบเทียบกับความหมายลำดับใด ๆ เนื่องจากพวกเขาสนับสนุนโน้ตบุ๊กที่สะอาดและทำซ้ำได้มากขึ้นซึ่งสามารถแปลงเป็นสคริปต์ Python ได้ง่ายขึ้นในภายหลัง ตอนนี้ฉันอาจจะหรือไม่อาจขายให้คุณในความหมายในการสั่งซื้อคุณสามารถเปิดใช้งานความหมายลำดับใด ๆ ใน ipyflow โดยการเรียกใช้คำสั่ง Magic %flow direction any_order และเปิดใช้งานความหมายเริ่มต้นในการสั่งซื้อโดยใช้ %flow direction in_order :
นอกจากนี้คุณยังสามารถอัปเดตโปรไฟล์ ipython ของคุณหากคุณต้องการทำให้ความหมายลำดับใด ๆ เป็นพฤติกรรมเริ่มต้นสำหรับเซสชันเคอร์เนลใหม่:
c = get_config ()
c . ipyflow . flow_direction = "any_order" # defaults to "in_order"เมื่อใดก็ตามที่เซลล์อ้างอิงข้อมูลที่อัปเดตแล้วการยุบถัดจากนั้นจะได้รับสีส้ม (คล้ายกับสีสำหรับเซลล์สกปรก) และเซลล์ที่ (ซ้ำ) ขึ้นอยู่กับมันจะได้รับสีม่วงยุบ (อินพุตสีส้มที่มีเอาต์พุตสีม่วงหมายความว่าเอาท์พุทอาจจะไม่ได้ซิงค์) เมื่อใช้การดำเนินการปฏิกิริยาคุณมักจะไม่เห็นสิ่งเหล่านี้เนื่องจากเซลล์ที่ขึ้นอยู่กับการซิงค์จะถูกเรียกใช้ใหม่โดยอัตโนมัติแม้ว่าคุณอาจเห็นพวกเขาหากใช้ Ctrl+shift+
หากคุณต้องการให้ ipyflow แก้ไขสิ่งเหล่านี้ให้คุณคุณสามารถกด "พื้นที่" เมื่ออยู่ในโหมดคำสั่งเพื่อแก้ไขเซลล์เก่าหรือสกปรกทั้งหมดโดยอัตโนมัติ การดำเนินการนี้อาจแนะนำเซลล์เก่าแก่มากขึ้นซึ่งในกรณีนี้คุณสามารถกด "พื้นที่" ต่อไปได้จนกว่าความไม่สอดคล้องทั้งหมดจะได้รับการแก้ไขหากต้องการ:
เซลล์ที่อ้างอิงฟังก์ชั่น Python และคลาสดั้งเดิมเช่นจำนวนเต็มลอยสตริงและอาร์เรย์ numpy dataframes pandas และภาชนะบรรจุ (รายการ, dicts, ชุด, tuples, ฯลฯ ) สามารถบันทึกโดย ipyflow โดยใช้ %%memoize ไม่จำเป็นต้องระบุ "อินพุต" ไปยังเซลล์เนื่องจาก ipyflow จะอนุมานได้โดยอัตโนมัติ เซลล์ช่วยจำแคชผลลัพธ์ของพวกเขาในหน่วยความจำ (แม้ว่าแคชที่ได้รับการสนับสนุนจากดิสก์จะถูกวางแผนไว้สำหรับอนาคต) และจะดึงผลลัพธ์ที่แคชเหล่านี้ (แทนที่จะทำงานอีกครั้ง) เมื่อใดก็ตามที่ IpyFlow ตรวจพบอินพุตและเนื้อหาของเซลล์เหมือนกัน
โดยค่าเริ่มต้น %%memoize ข้ามเอาต์พุตทั้งหมดยกเว้นเอาต์พุต displayhook ที่เป็นไปได้จากนิพจน์สุดท้ายในเซลล์ (เมื่อมี) หากต้องการข้ามสิ่งนี้เช่นกัน Pass --quiet และรวมถึง Stdout, Stderr และเอาท์พุทที่อุดมไปด้วยอื่น ๆ ผ่าน --verbose :
เอ็นจิ้นการดำเนินการตอบโต้ของ Ipyflow มีการสนับสนุนในตัวสำหรับ ipywidgets ทำให้วิดเจ็ตมีการเปลี่ยนแปลงที่จะแพร่กระจายไปทั่วขอบเขตของเซลล์:
ฟังก์ชั่นนี้สามารถใช้ร่วมกับ Magic %%memoize Magic เพื่อให้ใกล้เคียงกับการแสดงผลแบบอินเทอร์แอคทีฟแบบเรียลไทม์ข้ามเซลล์:
ฟังก์ชั่นนี้สามารถจับคู่กับส่วนขยายอื่น ๆ เช่น Stickyland เพื่อสร้างแดชบอร์ดที่มีปฏิกิริยาอย่างเต็มที่ด้านบนของ Jupyterlab + Ipyflow
ในที่สุด IpyFlow ก็รวมเข้ากับวิดเจ็ตปรอทด้วย:
Ipyflow ต้องเข้าใจสถานะการดำเนินการพื้นฐานในระดับลึกเพื่อให้คุณสมบัติของมัน มันเปิดเผย API สำหรับการโต้ตอบกับสถานะนี้บางส่วนรวมถึงฟังก์ชั่น code เพื่อรับรหัสที่จำเป็นในการสร้างสัญลักษณ์บางอย่าง:
# Cell 1
from ipyflow import code
# Cell 2
x = 0
# Cell 3
y = x + 1
# Cell 4
print ( code ( y ))
# Output:
"""
# Cell 2
x = 0
# Cell 3
y = x + 1
""" คุณสามารถทำได้ในระดับเซลล์เช่นกันโดยใช้วิธี slice() :
from ipyflow import cells
print ( cells ( 4 ). slice ())
# Output:
"""
# Cell 2
x = 0
# Cell 3
y = x + 1
# Cell 4
print(code(y))
""" นอกจากนี้คุณยังสามารถดูเซลล์ (1-indexed) และคำสั่ง (0-indexed) ของเมื่อสัญลักษณ์ได้รับการอัปเดตล่าสุดด้วยฟังก์ชั่น timestamp :
from ipyflow import timestamp
timestamp ( y )
# Timestamp(cell_num=3, stmt_num=0) หากต้องการดูการพึ่งพาและผู้ติดตามสัญลักษณ์เฉพาะให้ใช้ deps และ users fuctions ตามลำดับ:
from ipyflow import deps , users
deps ( y )
# [<x>]
users ( x )
# [<y>] หากคุณต้องการยกระดับสัญลักษณ์ไปยังการเป็นตัวแทนที่ใช้ภายในโดย IpyFlow ให้ใช้ฟังก์ชั่น lift (ตามความเสี่ยงของคุณเอง):
from ipyflow import lift
y_sym = lift ( y )
y_sym . timestamp
# Timestamp(cell_num=3, stmt_num=0) การเกิดปฏิกิริยาและคุณสมบัติส่วนหน้ายังไม่ทำงานในอินเทอร์เฟซเช่น colab หรือ vscode แต่คุณยังสามารถใช้ DataFlow API ของ IpyFlow บนพื้นผิวเหล่านี้โดยเริ่มต้นเซสชันโน้ตบุ๊กด้วยรหัสต่อไปนี้:
%pip install ipyflow
%load_ext ipyflow
Ipyflow เริ่มต้นชีวิตภายใต้ชื่อ nbsafety ซึ่งให้คำแนะนำเบื้องต้นและฟังก์ชั่นการหั่น
สำหรับคำแนะนำการดำเนินการ:
@article { macke2021fine ,
title = { Fine-grained lineage for safer notebook interactions } ,
author = { Macke, Stephen and Gong, Hongpu and Lee, Doris Jung-Lin and Head, Andrew and Xin, Doris and Parameswaran, Aditya } ,
journal = { Proceedings of the VLDB Endowment } ,
volume = { 14 } ,
number = { 6 } ,
pages = { 1093--1101 } ,
year = { 2021 } ,
publisher = { VLDB Endowment }
} สำหรับตัวแบ่งสัญญาณแบบไดนามิก (ใช้สำหรับการเกิดปฏิกิริยาและสำหรับฟังก์ชัน code เป็นต้น):
@article { shankar2022bolt ,
title = { Bolt-on, Compact, and Rapid Program Slicing for Notebooks } ,
author = { Shankar, Shreya and Macke, Stephen and Chasins, Andrew and Head, Andrew and Parameswaran, Aditya } ,
journal = { Proceedings of the VLDB Endowment } ,
volume = { 15 } ,
number = { 13 } ,
pages = { 4038--4047 } ,
year = { 2022 } ,
publisher = { VLDB Endowment }
}สำหรับสิ่งที่ไม่ครอบคลุมในเอกสารข้างต้นคุณสามารถอ้างถึง ipyflow repo:
@misc { ipyflow ,
title = { {IPyflow: A Next-Generation, Dataflow-Aware IPython Kernel} } ,
howpublished = { url{https://github.com/ipyflow/ipyflow} } ,
year = { 2022 } ,
}Ipyflow จะเป็นไปไม่ได้หากไม่มีผู้ทำงานร่วมกันทางวิชาการที่น่าทึ่งที่ระบุไว้ในเอกสารข้างต้น คุณสมบัติการดำเนินการปฏิกิริยาของมันได้รับแรงบันดาลใจจากเครื่องมือที่ยอดเยี่ยมอื่น ๆ เช่นโน๊ตบุ๊ค Hex, Pluto.jl และที่สังเกตได้ Ipyflow ยังสนุกกับการผสมเกสรของไอเดียกับสมุดบันทึก Python ปฏิกิริยาอื่น ๆ เช่น Marimo, Jolin.io และ Datalore --- ตรวจสอบพวกเขาอย่างแน่นอนเช่นกันถ้าคุณชอบ IpyFlow
การทำงานเกี่ยวกับ Ipyflow ได้รับประโยชน์จากการสนับสนุนของผู้คนจากหลาย ๆ บริษัท - ทั้งในรูปแบบของการมีส่วนร่วมทางการเงินโดยตรง (Databricks, hex) รวมถึงการสนับสนุนทางศีลธรรมและการให้กำลังใจทางอ้อม (Ponder, Meta) และแน่นอนว่า Ipyflow วางอยู่บนฐานรากที่สร้างโดยชุมชน Jupyter ที่น่าทึ่ง
รหัสในโครงการนี้ได้รับอนุญาตภายใต้ใบอนุญาต BSD-3-clause