Средство проверки типов выделяет «Неожиданный аргумент» для динамически создаваемой функцииPython

Программы на Python
Ответить
Anonymous
 Средство проверки типов выделяет «Неожиданный аргумент» для динамически создаваемой функции

Сообщение Anonymous »

Я пытаюсь создать функцию динамически. Вот пример:

Код: Выделить всё

import ast
import textwrap
from typing import Any, Callable, List, Union

def create_function(
func_name: str,
arg_types: List[Any],
):
union_elts = [ast.Name(id=t.__name__, ctx=ast.Load()) for t in arg_types]
vararg_annotation = ast.Subscript(
value=ast.Name(id='Union', ctx=ast.Load()),
slice=ast.Tuple(elts=union_elts, ctx=ast.Load()),
ctx=ast.Load()
)

args_node = ast.arguments(
posonlyargs=[],
args=[],
vararg=ast.arg(arg='args', annotation=vararg_annotation),
kwonlyargs=[],
kw_defaults=[],
defaults=[]
)

body_code = f"""
return ', '.join([str(t) for t in args])
"""

function_def = ast.FunctionDef(
name=func_name,
args=args_node,
returns=ast.Name(id=str.__name__, ctx=ast.Load()),
body=ast.parse(textwrap.dedent(body_code)).body,
decorator_list=[],
)

module = ast.Module(body=[function_def], type_ignores=[])
ast.fix_missing_locations(module)
code = compile(module, filename="", mode="exec")
exec_scope = {}
exec(code, {'Union': Union, **globals()}, exec_scope)

return exec_scope[func_name]

test: Callable[
[Union[str | int | float], ...],
str
] = create_function(
func_name='test',
arg_types=[str, int, float],
)

print(test('1', 2, 3.0, '4'))
Функция работает нормально, в описании указано test: (str | int | float, Any) -> str. Но я вижу предупреждение Неожиданный аргумент после второго аргумента (PyCharm Build #PY-251.23774.444, built on April 15, 2025). Как это исправить, или это проблема моего редактора кода?
Я пытался очистить кэш файловой системы и кэши/индексы журналов VCS - не помогло.
Изображение


Подробнее здесь: https://stackoverflow.com/questions/798 ... d-function
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»