- RestrictedPython 4.0b8
- Python 3.7.2
RedashのPythonデータソースでPythonを書けるようになるけど、このPythonデータソースにはRestrictedPythonというモジュールが使われている。 このRestrictedPythonで、使えるPythonの構文を制限することが出来る。
下が例。↓の例をアレンジした。でも TypeError: tuple indices must be integers or slices, not str
ってなるのは絶対ちがう挙動だと思う。
from RestrictedPython import compile_restricted from RestrictedPython.Guards import safe_builtins safe_builtins = ( 'sorted', 'reversed', 'map', 'reduce', 'any', 'all', 'slice', 'filter', 'len', 'next', 'enumerate', 'sum', 'abs', 'min', 'max', 'round', 'cmp', 'divmod', 'str', 'unicode', 'int', 'float', 'complex', 'tuple', 'set', 'list', 'dict', 'bool', ) source_code = """ def add(x): return int(x) + 1 """ # source_code = "import this" context = {} try: byte_code = compile_restricted(source_code, '<inline>', 'exec') exec(byte_code, {'__builtins__': safe_builtins}, context) except SyntaxError as e: raise e assert 2 == context['add'](1)
構文制限よりも、Redash的にはグローバルにimportを使わないで関数の中で使うよう求められている。 でもRedashのソースを見る限りだと、ふっつーにintとかstrとか使えてんだよなー。safe_builtinsに定義されているってことは、そこに書いてあるワードは使えないはずなんだけど。
なんだかよくわからない。