@@ -4715,7 +4715,7 @@ def _infer(
4715
4715
continue
4716
4716
4717
4717
4718
- MISSING_VALUE = "{MISSING_VALUE }"
4718
+ UNINFERABLE_VALUE = "{Uninferable }"
4719
4719
4720
4720
4721
4721
class JoinedStr (NodeNG ):
@@ -4781,33 +4781,59 @@ def get_children(self):
4781
4781
def _infer (
4782
4782
self , context : InferenceContext | None = None , ** kwargs : Any
4783
4783
) -> Generator [InferenceResult , None , InferenceErrorInfo | None ]:
4784
- yield from self ._infer_from_values (self .values , context )
4784
+ if self .values :
4785
+ yield from self ._infer_with_values (context )
4786
+ else :
4787
+ yield Const ("" )
4788
+
4789
+ def _infer_with_values (
4790
+ self , context : InferenceContext | None = None , ** kwargs : Any
4791
+ ) -> Generator [InferenceResult , None , InferenceErrorInfo | None ]:
4792
+ uninferable_already_generated = False
4793
+ for inferred in self ._infer_from_values (self .values , context ):
4794
+ failed = (
4795
+ inferred is util .Uninferable
4796
+ or isinstance (inferred , Const )
4797
+ and UNINFERABLE_VALUE in inferred .value
4798
+ )
4799
+ if failed :
4800
+ if not uninferable_already_generated :
4801
+ uninferable_already_generated = True
4802
+ yield util .Uninferable
4803
+ continue
4804
+ yield inferred
4785
4805
4786
4806
@classmethod
4787
4807
def _infer_from_values (
4788
4808
cls , nodes : list [NodeNG ], context : InferenceContext | None = None , ** kwargs : Any
4789
4809
) -> Generator [InferenceResult , None , InferenceErrorInfo | None ]:
4790
4810
if not nodes :
4791
- yield
4792
4811
return
4793
4812
if len (nodes ) == 1 :
4794
- yield from nodes [0 ]._infer (context , ** kwargs )
4813
+ for node in cls ._safe_infer_from_node (nodes [0 ], context , ** kwargs ):
4814
+ if isinstance (node , Const ):
4815
+ yield node
4816
+ continue
4817
+ yield Const (UNINFERABLE_VALUE )
4795
4818
return
4796
- uninferable_already_generated = False
4797
- for prefix in nodes [0 ]._infer (context , ** kwargs ):
4819
+ for prefix in cls ._safe_infer_from_node (nodes [0 ], context , ** kwargs ):
4798
4820
for suffix in cls ._infer_from_values (nodes [1 :], context , ** kwargs ):
4799
4821
result = ""
4800
4822
for node in (prefix , suffix ):
4801
4823
if isinstance (node , Const ):
4802
4824
result += str (node .value )
4803
4825
continue
4804
- result += MISSING_VALUE
4805
- if MISSING_VALUE in result :
4806
- if not uninferable_already_generated :
4807
- uninferable_already_generated = True
4808
- yield util .Uninferable
4809
- else :
4810
- yield Const (result )
4826
+ result += UNINFERABLE_VALUE
4827
+ yield Const (result )
4828
+
4829
+ @classmethod
4830
+ def _safe_infer_from_node (
4831
+ cls , node : NodeNG , context : InferenceContext | None = None , ** kwargs : Any
4832
+ ) -> Generator [InferenceResult , None , InferenceErrorInfo | None ]:
4833
+ try :
4834
+ yield from node ._infer (context , ** kwargs )
4835
+ except InferenceError :
4836
+ yield util .Uninferable
4811
4837
4812
4838
4813
4839
class NamedExpr (_base_nodes .AssignTypeNode ):
0 commit comments