Как запустить сразу все функции из файла?
Есть некий файл с множеством функций,пример:
import math
def task_integer1():
"""A distance L is given in centimeters.
Find the amount of full meters of this distance
(1 m = 100 cm)"""
try: # перевірка на помилки
l = int(input("L (sm) = "))
except: # якщо помилка
print("L must be an INTEGER !!!")
input("Press enter for exit ...")
else: # якщо немає помилки
res = l // 100
print("L = ", res, "m")
def task_integer2():
"""A weight M is given in kilograms.
Find the amount of full tons of this weight
(1 t = 1000 kg)"""
try: # перевірка на помилки
m = int(input("M (kg) = "))
except: # якщо помилка
print("M must be an INTEGER !!!")
input("Press enter for exit ...")
else: # якщо немає помилки
res = m // 1000
print("M = ", res, "t")
Когда я запускаю его с консоли то ничего не происходит. Когда же объявляю функцию в конце файла то выполняется только объявленная. А в будущем этих функций будет более сотни... Не обьявлять же каждую из них в конце файла...
P.S. К сожалению по условию задания нельзя все функции объединить в одну
Как мне запустить все функции сразу?
Ответы (4 шт):
Можно так, например, хотя это и не очень хороший стиль:
for f in globals().copy():
if f.startswith('task_'):
print('Запуск ', f)
eval(f'{f}()')
Должны запустится все функции, которые начинаются на task_.
Примерно тоже самое что и у @CrasyElf но без eval
for f in globals().copy():
if f.startswith('task_'):
print('Запуск ', f)
globals()[f]()
либо
for name, f in globals().copy().items():
if name.startswith('task_'):
print('Запуск ', name)
f()
Одна функция для запуска задания (вместо кучи однотипных отдельных функций для каждого задания), каждое задание - строка в списке (данные по сути)
def execute_task(prompt: str, error_text: str, function, output_format: str):
try: # перевірка на помилки
x = int(input(prompt))
except: # якщо помилка
print(error_text)
input("Press enter for exit ...")
else: # якщо немає помилки
res = function(x)
print(output_format.format(res))
tasks = [
("L (sm) = ", "L must be an INTEGER !!!", lambda l: l // 100, "L = {} m"),
("M (kg) = ", "M must be an INTEGER !!!", lambda m: m // 1000, "M = {} t"),
]
for task in tasks:
execute_task(*task)
Вариант, когда может быть несколько входных переменных:
def execute_task(prompts, error_texts, function, calculation_error_text, output_format: str):
data = []
for prompt, error_text in zip(prompts, error_texts):
try:
x = int(input(prompt))
except:
print(error_text)
input("Press enter for exit ...")
return
else:
data.append(x)
try:
res = function(*data)
except:
print(calculation_error_text)
else:
print(output_format.format(res))
tasks = [
(["L (sm) = "], ["L must be an INTEGER !!!"], lambda l: l // 100, "", "L = {} m"),
(["M (kg) = "], ["M must be an INTEGER !!!"], lambda m: m // 1000, "", "M = {} t"),
(["U (V) = ", "I (A) = "], ["U must be an INTEGER !!!", "I must be an INTEGER !!!"], lambda u, i: u / i,
"I must not be 0 !!!", "R = {} Ω"),
]
for task in tasks:
execute_task(*task)
isinstance(ob, types.FunctionType)

import types, logging
def execute_task(module_name, deny_func_part=(), deny_startswith_func=(), allow_func=(), startswith_func=()):
"""
:param module_name: str: имя модуля
:param deny_func_part: [str]: в именах функций модуля это содержаться не должно
:param deny_startswith_func: [str]: имена функций модуля начинается так не должны
:param allow_func: [str]: имена функций модуля должны называться именно так
:param startswith_func: [str]: имена функций модуля начинается должны именно так
"""
module = __import__(module_name)
for attr in dir(module):
if (deny_func_part and (any((d in attr) for d in deny_func_part))) or (
deny_startswith_func and (any(str.startswith(attr, a) for a in deny_startswith_func))) or (
allow_func and (attr not in allow_func)) or (
startswith_func and (not any(str.startswith(attr, a) for a in startswith_func))):
continue
ob = getattr(module, attr)
if isinstance(ob, types.FunctionType):
logging.info(ob.__name__)
try:
ob.__call__() # run
except Exception as _e:
logging.exception(ob.__name__)
return
if __name__ == '__main__':
# запустить все функции модуля main, кроме содержащих в названии ['test', 'temp', ] и не начинающихся на ['_']
execute_task('main', deny_func_part=['test', 'temp', ], deny_startswith_func=['_'])