Anonymous
Средство проверки типов выделяет «Неожиданный аргумент» для динамически создаваемой функции
Сообщение
Anonymous » 12 ноя 2025, 21:33
Я пытаюсь создать функцию динамически. Вот пример:
Код: Выделить всё
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
1762972400
Anonymous
Я пытаюсь создать функцию динамически. Вот пример: [code]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')) [/code] Функция работает нормально, в описании указано test: (str | int | float, Any) -> str. Но я вижу предупреждение [b]Неожиданный аргумент[/b] после второго аргумента (PyCharm Build #PY-251.23774.444, built on April 15, 2025). Как это исправить, или это проблема моего редактора кода? Я пытался очистить кэш файловой системы и кэши/индексы журналов VCS - не помогло. [img]https://i.sstatic.net/MBXvYgpB.png[/img] Подробнее здесь: [url]https://stackoverflow.com/questions/79818125/type-checker-highlights-unexpected-argument-for-dynamically-generated-function[/url]