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:39 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
@@ -732,6 +732,7 @@ This generates:
732732
733733``` python
734734def greet (name : str ) -> str :
735+
735736 greeting = f " Hello, { name} ! "
736737 return greeting
737738```
@@ -1794,13 +1795,13 @@ This generates:
17941795async def process_item_task (item : str ) -> str :
17951796 builder_0040: Any = task()
17961797
1797- def _arrow43 (item : Any = item) -> Callable[[FSharpRef[Any]], bool ]:
1798- def _arrow42 (__unit : Unit = UNIT ) -> Callable[[FSharpRef[Any]], bool ]:
1798+ def _arrow59 (item : Any = item) -> Callable[[FSharpRef[Any]], bool ]:
1799+ def _arrow58 (__unit : Unit = UNIT ) -> Callable[[FSharpRef[Any]], bool ]:
17991800 return builder_0040.Return(item.upper())
18001801
1801- return builder_0040.Bind(delay(int32(100 )), _arrow42 )
1802+ return builder_0040.Bind(delay(int32(100 )), _arrow58 )
18021803
1803- return await builder_0040.Run(builder_0040.Delay(_arrow43 ))
1804+ return await builder_0040.Run(builder_0040.Delay(_arrow59 ))
18041805```
18051806
18061807Now frameworks like FastAPI can detect and handle these as proper async endpoints.
@@ -1875,13 +1876,13 @@ In Python, this generates:
18751876
18761877``` python
18771878def simple_async (__unit : Unit = UNIT ) -> Async[int32]:
1878- def _arrow52 (__unit : Unit = UNIT ) -> Async[int32]:
1879- def _arrow51 (__unit : Unit = UNIT ) -> Async[int32]:
1879+ def _arrow68 (__unit : Unit = UNIT ) -> Async[int32]:
1880+ def _arrow67 (__unit : Unit = UNIT ) -> Async[int32]:
18801881 return singleton.Return(int32(42 ))
18811882
1882- return singleton.Bind(sleep(int32(500 )), _arrow51 )
1883+ return singleton.Bind(sleep(int32(500 )), _arrow67 )
18831884
1884- return singleton.Delay(_arrow52 )
1885+ return singleton.Delay(_arrow68 )
18851886```
18861887
18871888#### Tasks → Native async def
@@ -1902,13 +1903,13 @@ In Python, this generates:
19021903async def simple_task (__unit : Unit = UNIT ) -> int32:
19031904 builder_0040: Any = task()
19041905
1905- def _arrow54 (__unit : Unit = UNIT ) -> Callable[[FSharpRef[Any]], bool ]:
1906- def _arrow53 (__unit : Unit = UNIT ) -> Callable[[FSharpRef[Any]], bool ]:
1906+ def _arrow70 (__unit : Unit = UNIT ) -> Callable[[FSharpRef[Any]], bool ]:
1907+ def _arrow69 (__unit : Unit = UNIT ) -> Callable[[FSharpRef[Any]], bool ]:
19071908 return builder_0040.Return(int32(42 ))
19081909
1909- return builder_0040.Bind(delay(int32(500 )), _arrow53 )
1910+ return builder_0040.Bind(delay(int32(500 )), _arrow69 )
19101911
1911- return await builder_0040.Run(builder_0040.Delay(_arrow54 ))
1912+ return await builder_0040.Run(builder_0040.Delay(_arrow70 ))
19121913```
19131914
19141915#### Running Tasks from F` # `
@@ -2981,7 +2982,7 @@ class API:
29812982 async def get_item (item_id : int32) -> Any:
29822983 builder_0040: Any = task()
29832984
2984- def _arrow97 (__unit : Unit = UNIT ) -> Callable[[FSharpRef[Any]], bool ]:
2985+ def _arrow113 (__unit : Unit = UNIT ) -> Callable[[FSharpRef[Any]], bool ]:
29852986 def predicate (i : Item) -> bool :
29862987 return i.Id == item_id
29872988
@@ -2993,26 +2994,26 @@ class API:
29932994 item: Item = match_value
29942995 return builder_0040.Return(item)
29952996
2996- return await builder_0040.Run(builder_0040.Delay(_arrow97 ))
2997+ return await builder_0040.Run(builder_0040.Delay(_arrow113 ))
29972998
29982999 @app.post (" /items" )
29993000 @ staticmethod
30003001 async def create_item (request : CreateItemRequest) -> Any:
30013002 builder_0040: Any = task()
30023003
3003- def _arrow99 (__unit : Unit = UNIT ) -> Callable[[FSharpRef[Any]], bool ]:
3004+ def _arrow115 (__unit : Unit = UNIT ) -> Callable[[FSharpRef[Any]], bool ]:
30043005 def mapping (i : Item) -> int32:
30053006 return i.Id
30063007
3007- class ObjectExpr98 :
3008+ class ObjectExpr114 :
30083009 def Compare (self , x : int32, y : int32) -> int32:
30093010 return compare_primitives(x, y)
30103011
30113012 new_item: Item = Item(
30123013 Id = int32.ONE
30133014 if (int32(len (items)) == int32.ZERO )
30143015 else (
3015- max (map (mapping, to_enumerable(items)), ObjectExpr98 ()) + int32.ONE
3016+ max (map (mapping, to_enumerable(items)), ObjectExpr114 ()) + int32.ONE
30163017 ),
30173018 Name = request.Name,
30183019 Price = request.Price,
@@ -3021,7 +3022,7 @@ class API:
30213022 (items.append(new_item))
30223023 return builder_0040.Return({" item" : new_item, " status" : " created" })
30233024
3024- return await builder_0040.Run(builder_0040.Delay(_arrow99 ))
3025+ return await builder_0040.Run(builder_0040.Delay(_arrow115 ))
30253026```
30263027
30273028#### Key Points
@@ -3712,16 +3713,22 @@ For example, the extractSymbol function in F# generates this Python:
37123713``` python
37133714def extract_symbol (symbol : str , lines : Array[str ]) -> str | None :
37143715 """ Extracts a single symbol definition from Python source lines."""
3716+ option_1: int32 | None = erase(find_definition_index(symbol, lines))
3717+ if option_1 is not None :
3718+
3719+ def _arrow25 (option_1 : int32, lines : Any = lines) -> str :
3720+ def_index: int32 = option_1
3721+ start_index: int32 = find_decorator_start(lines, def_index)
3722+ return (
3723+ extract_multiline_body(start_index, def_index, lines)
3724+ if is_multiline_definition(lines[def_index])
3725+ else lines[def_index]
3726+ )
37153727
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]
3728+ return _arrow25(option_1)
37233729
3724- return erase(map (mapping, find_definition_index(symbol, lines)))
3730+ else :
3731+ return None
37253732```
37263733
37273734### Main Entry Point
0 commit comments