diff --git a/python/src/com/jetbrains/python/codeInsight/typing/PyTypingTypeProvider.java b/python/src/com/jetbrains/python/codeInsight/typing/PyTypingTypeProvider.java
index 57df3eb18c68..9c9d4f8d4d9c 100644
--- a/python/src/com/jetbrains/python/codeInsight/typing/PyTypingTypeProvider.java
+++ b/python/src/com/jetbrains/python/codeInsight/typing/PyTypingTypeProvider.java
@@ -312,8 +312,9 @@ public class PyTypingTypeProvider extends PyTypeProviderBase {
final PyElementGenerator generator = PyElementGenerator.getInstance(referenceExpression.getProject());
parameters.add(PyCallableParameterImpl.nonPsi("name", builtinCache.getStringType(languageLevel)));
- parameters.add(PyCallableParameterImpl.positionalNonPsi("constraints", builtinCache.getTypeType()));
- parameters.add(PyCallableParameterImpl.nonPsi("bound", builtinCache.getTypeType(), generator.createEllipsis()));
+ final PyType typeOrForwardReference = PyUnionType.union(builtinCache.getTypeType(), builtinCache.getStrType());
+ parameters.add(PyCallableParameterImpl.positionalNonPsi("constraints", typeOrForwardReference));
+ parameters.add(PyCallableParameterImpl.nonPsi("bound", typeOrForwardReference, generator.createEllipsis()));
final PyClassType boolType = builtinCache.getBoolType();
final PyExpression falseValue = generator.createExpressionFromText(languageLevel, "False");
diff --git a/python/testData/inspections/PyTypeCheckerInspection/InitializingTypeVar.py b/python/testData/inspections/PyTypeCheckerInspection/InitializingTypeVar.py
index 01fd0044e96a..e6f2ca65ea61 100644
--- a/python/testData/inspections/PyTypeCheckerInspection/InitializingTypeVar.py
+++ b/python/testData/inspections/PyTypeCheckerInspection/InitializingTypeVar.py
@@ -1,4 +1,7 @@
from typing import TypeVar
TypeVar("T", int, str, bound=int, covariant=True, contravariant=True)
-TypeVar("T", 0, 1, bound=2, covariant=3, contravariant=4)
\ No newline at end of file
+TypeVar("T", int, str, bound='int', covariant=True, contravariant=True)
+TypeVar("T", int, 'str', bound=int, covariant=True, contravariant=True)
+TypeVar("T", 'int', 'str', bound=int, covariant=True, contravariant=True)
+TypeVar("T", 0, 1, bound=2, covariant=3, contravariant=4)
\ No newline at end of file
diff --git a/python/testSrc/com/jetbrains/python/PyParameterInfoTest.java b/python/testSrc/com/jetbrains/python/PyParameterInfoTest.java
index e3e76c9114ed..050d66e98a24 100644
--- a/python/testSrc/com/jetbrains/python/PyParameterInfoTest.java
+++ b/python/testSrc/com/jetbrains/python/PyParameterInfoTest.java
@@ -846,14 +846,15 @@ public class PyParameterInfoTest extends LightMarkedTestCase {
);
}
- // PY-28127
+ // PY-28127 PY-31424
public void testInitializingTypeVar() {
runWithLanguageLevel(
LanguageLevel.PYTHON34,
() -> {
final int offset = loadTest(1).get("").getTextOffset();
- feignCtrlP(offset).check("name: str, *constraints: type, bound: type=..., covariant: bool=False, contravariant: bool=False",
+ feignCtrlP(offset).check("name: str, *constraints: Union[type, str], bound: Union[type, str]=..., " +
+ "covariant: bool=False, contravariant: bool=False",
new String[]{"name: str, "},
ArrayUtil.EMPTY_STRING_ARRAY);
}
diff --git a/python/testSrc/com/jetbrains/python/inspections/Py3TypeCheckerInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/Py3TypeCheckerInspectionTest.java
index 881db67ca55b..6b9d3594b143 100644
--- a/python/testSrc/com/jetbrains/python/inspections/Py3TypeCheckerInspectionTest.java
+++ b/python/testSrc/com/jetbrains/python/inspections/Py3TypeCheckerInspectionTest.java
@@ -81,7 +81,7 @@ public class Py3TypeCheckerInspectionTest extends PyInspectionTestCase {
public void testStrFormatPy3() {
doTest();
}
-
+
// PY-18762
public void testHomogeneousTuples() {
doTest();
@@ -341,7 +341,7 @@ public class Py3TypeCheckerInspectionTest extends PyInspectionTestCase {
runWithLanguageLevel(LanguageLevel.PYTHON37, () -> super.doMultiFileTest());
}
- // PY-28127
+ // PY-28127 PY-31424
public void testInitializingTypeVar() {
doTest();
}