@@ -591,7 +591,7 @@ class Node(str):
591591nan_policy_stack = []
592592dynamic_backend_stack = []
593593warn_to_regex = {"all" : "!.*" , "ivy_only" : "^(?!.*ivy).*$" , "none" : ".*" }
594-
594+ cython_wrappers_stack = []
595595
596596# local
597597import threading
@@ -741,7 +741,7 @@ class Node(str):
741741
742742locks = {"backend_setter" : threading .Lock ()}
743743
744-
744+ from . wrappers import *
745745from .func_wrapper import *
746746from .data_classes .array import Array , add_ivy_array_instance_methods
747747from .data_classes .array .conversions import *
@@ -776,6 +776,7 @@ class Node(str):
776776 choose_random_backend ,
777777 unset_backend ,
778778)
779+ from . import wrappers
779780from . import func_wrapper
780781from .utils import assertions , exceptions , verbosity
781782from .utils .backend import handler
@@ -961,6 +962,7 @@ def __deepcopy__(self, memo):
961962 "default_uint_dtype_stack" : data_type .default_uint_dtype_stack ,
962963 "nan_policy_stack" : nan_policy_stack ,
963964 "dynamic_backend_stack" : dynamic_backend_stack ,
965+ "cython_wrappers_stack" : cython_wrappers_stack ,
964966})
965967
966968_default_globals = copy .deepcopy (globals_vars )
@@ -1144,7 +1146,7 @@ def unset_nan_policy():
11441146ivy .dynamic_backend = dynamic_backend_stack [- 1 ] if dynamic_backend_stack else True
11451147
11461148
1147- def set_dynamic_backend (flag ):
1149+ def set_dynamic_backend (flag ): # noqa: D209
11481150 """Set the global dynamic backend setting to the provided flag (True or
11491151 False)"""
11501152 global dynamic_backend_stack
@@ -1166,6 +1168,37 @@ def unset_dynamic_backend():
11661168 ivy .__setattr__ ("dynamic_backend" , flag , True )
11671169
11681170
1171+ # Cython wrappers
1172+
1173+ ivy .cython_wrappers_mode = cython_wrappers_stack [- 1 ] if cython_wrappers_stack else False
1174+
1175+
1176+ @handle_exceptions
1177+ def set_cython_wrappers_mode (flag : bool = True ) -> None :
1178+ """Set the mode of whether to use cython wrappers for functions.
1179+
1180+ Parameter
1181+ ---------
1182+ flag
1183+ boolean whether to use cython wrappers for functions
1184+
1185+ Examples
1186+ --------
1187+ >>> ivy.set_cython_wrappers_mode(False)
1188+ >>> ivy.cython_wrappers_mode
1189+ False
1190+
1191+ >>> ivy.set_cython_wrappers_mode(True)
1192+ >>> ivy.cython_wrappers_mode
1193+ True
1194+ """
1195+ global cython_wrappers_stack
1196+ if flag not in [True , False ]:
1197+ raise ValueError ("cython_wrappers_mode must be a boolean value (True or False)" )
1198+ cython_wrappers_stack .append (flag )
1199+ ivy .__setattr__ ("cython_wrappers_mode" , flag , True )
1200+
1201+
11691202# Context Managers
11701203
11711204
@@ -1438,6 +1471,7 @@ def cast_data_types(val=True):
14381471 "default_int_dtype" ,
14391472 "default_complex_dtype" ,
14401473 "default_uint_dtype" ,
1474+ "cython_wrappers_mode" ,
14411475]
14421476
14431477
@@ -1479,7 +1513,7 @@ def set_logging_mode(self, mode):
14791513 logging .getLogger ().setLevel (mode )
14801514 self .logging_mode_stack .append (mode )
14811515
1482- def unset_logging_mode (self ):
1516+ def unset_logging_mode (self ): # noqa: D209
14831517 """Remove the most recently set logging mode, returning to the previous
14841518 one."""
14851519 if len (self .logging_mode_stack ) > 1 :
0 commit comments