Помогите, пожалуйста. Уже жду неделю. Python

def firi(param1, param2, func, check):     
    if isinstance(param1, int) and isinstance(param2, int):     
        # Если оба параметра - числа     
        for i in range(param1, param2):     
            if eval(str(check)):     
                exec(str(func))     
    else:     
        if isinstance(param1, int):     
            # Если первый параметр - число, а второй - промежуток для цикла     
            for i in range(param2):     
                if eval(str(check)):     
                    exec(str(func))     
    else:     
            # Если первый параметр - переменная, а второй - число     
            if eval(str(check)):     
                exec(str(func))    
j=5     
firi(j, 10, 'print(j)', 2+2==4)

Сейчас выводит 5 пятёрок, а может кто помочь, чтобы выводило от 5 до 9? Но, чтобы осталась такая запись: firi(j, 10, 'print(j)', 2+2==4)


Ответы (2 шт):

Автор решения: Dark Space

Ваш комментарий очень прояснил ситуацию. Нельзя ли обойтись таким вариантом?

def foo(a, b, func, check): 
    for j in range(a, b): 
        if check: 
            exec(func)
            
            
foo(5, 10, 'print(j)', 2 + 2 == 4)

Единственный минус, который на данный момент я вижу, это то, что имя переменной j должно совпадать в print(j) и цикле for

P.S. exec нужно использовать аккуратно, и не применять его к коду, который приходит откуда-то извне

→ Ссылка
Автор решения: CrazyElf

Используйте в качестве параметра func анонимную функцию lambda, тогда и exec не нужен:

def firi(param1, param2, func, check):     
    ...
        for i in range(param1, param2):     
            if eval(str(check)):     
                func(i)  
...
firi(j, 10, lambda x: print(x), 2+2==4)

Да и check у вас сейчас просто True, я бы его тоже на какую-нибудь lambda поменял.

→ Ссылка