11# Introduction to Fable.Python
22
3- * Generated on 2026-05-28 17:23 UTC using Fable v5.0 .0*
3+ * Generated on 2026-08-13 21:38 UTC using Fable v5.13 .0* .
44
55> This post is part of the [ F# Advent Calendar
66 2025] ( https://sergeytihon.com/2025/11/03/f-advent-calendar-in-english-2025/ ) . Thank you, Sergey Tihon, for organizing
@@ -1794,13 +1794,13 @@ This generates:
17941794async def process_item_task (item : str ) -> str :
17951795 builder_0040: Any = task()
17961796
1797- def _arrow43 (item : Any = item) -> Callable[[FSharpRef[Any]], bool ]:
1798- def _arrow42 (__unit : Unit = UNIT ) -> Callable[[FSharpRef[Any]], bool ]:
1797+ def _arrow59 (item : Any = item) -> Callable[[FSharpRef[Any]], bool ]:
1798+ def _arrow58 (__unit : Unit = UNIT ) -> Callable[[FSharpRef[Any]], bool ]:
17991799 return builder_0040.Return(item.upper())
18001800
1801- return builder_0040.Bind(delay(int32(100 )), _arrow42 )
1801+ return builder_0040.Bind(delay(int32(100 )), _arrow58 )
18021802
1803- return await builder_0040.Run(builder_0040.Delay(_arrow43 ))
1803+ return await builder_0040.Run(builder_0040.Delay(_arrow59 ))
18041804```
18051805
18061806Now frameworks like FastAPI can detect and handle these as proper async endpoints.
@@ -1875,13 +1875,13 @@ In Python, this generates:
18751875
18761876``` python
18771877def simple_async (__unit : Unit = UNIT ) -> Async[int32]:
1878- def _arrow52 (__unit : Unit = UNIT ) -> Async[int32]:
1879- def _arrow51 (__unit : Unit = UNIT ) -> Async[int32]:
1878+ def _arrow68 (__unit : Unit = UNIT ) -> Async[int32]:
1879+ def _arrow67 (__unit : Unit = UNIT ) -> Async[int32]:
18801880 return singleton.Return(int32(42 ))
18811881
1882- return singleton.Bind(sleep(int32(500 )), _arrow51 )
1882+ return singleton.Bind(sleep(int32(500 )), _arrow67 )
18831883
1884- return singleton.Delay(_arrow52 )
1884+ return singleton.Delay(_arrow68 )
18851885```
18861886
18871887#### Tasks → Native async def
@@ -1902,13 +1902,13 @@ In Python, this generates:
19021902async def simple_task (__unit : Unit = UNIT ) -> int32:
19031903 builder_0040: Any = task()
19041904
1905- def _arrow54 (__unit : Unit = UNIT ) -> Callable[[FSharpRef[Any]], bool ]:
1906- def _arrow53 (__unit : Unit = UNIT ) -> Callable[[FSharpRef[Any]], bool ]:
1905+ def _arrow70 (__unit : Unit = UNIT ) -> Callable[[FSharpRef[Any]], bool ]:
1906+ def _arrow69 (__unit : Unit = UNIT ) -> Callable[[FSharpRef[Any]], bool ]:
19071907 return builder_0040.Return(int32(42 ))
19081908
1909- return builder_0040.Bind(delay(int32(500 )), _arrow53 )
1909+ return builder_0040.Bind(delay(int32(500 )), _arrow69 )
19101910
1911- return await builder_0040.Run(builder_0040.Delay(_arrow54 ))
1911+ return await builder_0040.Run(builder_0040.Delay(_arrow70 ))
19121912```
19131913
19141914#### Running Tasks from F` # `
@@ -2981,7 +2981,7 @@ class API:
29812981 async def get_item (item_id : int32) -> Any:
29822982 builder_0040: Any = task()
29832983
2984- def _arrow97 (__unit : Unit = UNIT ) -> Callable[[FSharpRef[Any]], bool ]:
2984+ def _arrow113 (__unit : Unit = UNIT ) -> Callable[[FSharpRef[Any]], bool ]:
29852985 def predicate (i : Item) -> bool :
29862986 return i.Id == item_id
29872987
@@ -2993,26 +2993,26 @@ class API:
29932993 item: Item = match_value
29942994 return builder_0040.Return(item)
29952995
2996- return await builder_0040.Run(builder_0040.Delay(_arrow97 ))
2996+ return await builder_0040.Run(builder_0040.Delay(_arrow113 ))
29972997
29982998 @app.post (" /items" )
29992999 @ staticmethod
30003000 async def create_item (request : CreateItemRequest) -> Any:
30013001 builder_0040: Any = task()
30023002
3003- def _arrow99 (__unit : Unit = UNIT ) -> Callable[[FSharpRef[Any]], bool ]:
3003+ def _arrow115 (__unit : Unit = UNIT ) -> Callable[[FSharpRef[Any]], bool ]:
30043004 def mapping (i : Item) -> int32:
30053005 return i.Id
30063006
3007- class ObjectExpr98 :
3007+ class ObjectExpr114 :
30083008 def Compare (self , x : int32, y : int32) -> int32:
30093009 return compare_primitives(x, y)
30103010
30113011 new_item: Item = Item(
30123012 Id = int32.ONE
30133013 if (int32(len (items)) == int32.ZERO )
30143014 else (
3015- max (map (mapping, to_enumerable(items)), ObjectExpr98 ()) + int32.ONE
3015+ max (map (mapping, to_enumerable(items)), ObjectExpr114 ()) + int32.ONE
30163016 ),
30173017 Name = request.Name,
30183018 Price = request.Price,
@@ -3021,7 +3021,7 @@ class API:
30213021 (items.append(new_item))
30223022 return builder_0040.Return({" item" : new_item, " status" : " created" })
30233023
3024- return await builder_0040.Run(builder_0040.Delay(_arrow99 ))
3024+ return await builder_0040.Run(builder_0040.Delay(_arrow115 ))
30253025```
30263026
30273027#### Key Points
@@ -3712,16 +3712,22 @@ For example, the extractSymbol function in F# generates this Python:
37123712``` python
37133713def extract_symbol (symbol : str , lines : Array[str ]) -> str | None :
37143714 """ Extracts a single symbol definition from Python source lines."""
3715+ option_1: int32 | None = erase(find_definition_index(symbol, lines))
3716+ if option_1 is not None :
3717+
3718+ def _arrow25 (option_1 : int32, lines : Any = lines) -> str :
3719+ def_index: int32 = option_1
3720+ start_index: int32 = find_decorator_start(lines, def_index)
3721+ return (
3722+ extract_multiline_body(start_index, def_index, lines)
3723+ if is_multiline_definition(lines[def_index])
3724+ else lines[def_index]
3725+ )
37153726
3716- def mapping (def_index : int32, lines : Any = lines) -> str :
3717- start_index: int32 = find_decorator_start(lines, def_index)
3718- if is_multiline_definition(lines[def_index]):
3719- return extract_multiline_body(start_index, def_index, lines)
3720-
3721- else :
3722- return lines[def_index]
3727+ return _arrow25(option_1)
37233728
3724- return erase(map (mapping, find_definition_index(symbol, lines)))
3729+ else :
3730+ return None
37253731```
37263732
37273733### Main Entry Point
0 commit comments