1# This file also re-exports symbols for wider use. We configure mypy and flake8 
    2# to be aware that this file does this. 
    3 
    4from jedi.inference.compiled.value import CompiledValue, CompiledName, \ 
    5    CompiledValueFilter, CompiledValueName, create_from_access_path 
    6from jedi.inference.base_value import LazyValueWrapper 
    7 
    8 
    9def builtin_from_name(inference_state, string): 
    10    typing_builtins_module = inference_state.builtins_module 
    11    if string in ('None', 'True', 'False'): 
    12        builtins, = typing_builtins_module.non_stub_value_set 
    13        filter_ = next(builtins.get_filters()) 
    14    else: 
    15        filter_ = next(typing_builtins_module.get_filters()) 
    16    name, = filter_.get(string) 
    17    value, = name.infer() 
    18    return value 
    19 
    20 
    21class ExactValue(LazyValueWrapper): 
    22    """ 
    23    This class represents exact values, that makes operations like additions 
    24    and exact boolean values possible, while still being a "normal" stub. 
    25    """ 
    26    def __init__(self, compiled_value): 
    27        self.inference_state = compiled_value.inference_state 
    28        self._compiled_value = compiled_value 
    29 
    30    def __getattribute__(self, name): 
    31        if name in ('get_safe_value', 'execute_operation', 'access_handle', 
    32                    'negate', 'py__bool__', 'is_compiled'): 
    33            return getattr(self._compiled_value, name) 
    34        return super().__getattribute__(name) 
    35 
    36    def _get_wrapped_value(self): 
    37        instance, = builtin_from_name( 
    38            self.inference_state, self._compiled_value.name.string_name).execute_with_values() 
    39        return instance 
    40 
    41    def __repr__(self): 
    42        return '<%s: %s>' % (self.__class__.__name__, self._compiled_value) 
    43 
    44 
    45def create_simple_object(inference_state, obj): 
    46    """ 
    47    Only allows creations of objects that are easily picklable across Python 
    48    versions. 
    49    """ 
    50    assert type(obj) in (int, float, str, bytes, slice, complex, bool), repr(obj) 
    51    compiled_value = create_from_access_path( 
    52        inference_state, 
    53        inference_state.compiled_subprocess.create_simple_object(obj) 
    54    ) 
    55    return ExactValue(compiled_value) 
    56 
    57 
    58def get_string_value_set(inference_state): 
    59    return builtin_from_name(inference_state, 'str').execute_with_values() 
    60 
    61 
    62def load_module(inference_state, dotted_name, **kwargs): 
    63    # Temporary, some tensorflow builtins cannot be loaded, so it's tried again 
    64    # and again and it's really slow. 
    65    if dotted_name.startswith('tensorflow.'): 
    66        return None 
    67    access_path = inference_state.compiled_subprocess.load_module(dotted_name=dotted_name, **kwargs) 
    68    if access_path is None: 
    69        return None 
    70    return create_from_access_path(inference_state, access_path)