C11 поддерживает типовые выражения, которые должны делать то, что вы ищете:
#define Set_b(X, y) _Generic((X), A: Set_b_A,\
B: Set_b_B \
)((X), (y))
Затем просто реализовать Set_b_A
и Set_b_B
для соответствующих типов.
Ну, я хочу сделать то же самое и собирался спросить этот вопрос сам. Я хотел улучшить по следующему коду, потому что он имеет дублирование. Это позволит мне отправить в аргументы для проверки тестирования тестирования:
import unittest
import helpspot
class TestHelpSpot(unittest.TestCase):
"A few simple tests for HelpSpot"
def __init__(self, testname, path, user, pword):
super(TestHelpSpot, self).__init__(testname)
self.hs = helpspot.HelpSpot(path, user, pword)
def test_version(self):
a = self.hs.version()
b = self.hs.private_version()
self.assertEqual(a, b)
def test_get_with_param(self):
a = self.hs.filter_get(xFilter=1)
def test_unknown_method(self):
self.assertRaises(helpspot.HelpSpotError, self.hs.private_wuggienorple)
if __name__ == '__main__':
import sys
user = sys.argv[1]
pword = sys.argv[2]
path = sys.argv[3]
test_loader = unittest.TestLoader()
test_names = test_loader.getTestCaseNames(TestHelpSpot)
suite = unittest.TestSuite()
for test_name in test_names:
suite.addTest(TestHelpSpot(test_name, path, user, pword))
result = unittest.TextTestRunner().run(suite)
sys.exit(not result.wasSuccessful())
Я бы определенно не советовал передавать аргументы в setUp вот так; setUp предназначен для неявного вызова при запуске теста, поэтому не следует явно вызывать его следующим образом.
Одним из способов решения этой проблемы было бы установить значения, которые необходимо установить либо как переменные среды, либо как значения в глобально доступном «контекстном» модуле, что позволило бы тестовым примерам получать к ним доступ при необходимости. Я бы хотел использовать переменные окружения, так как он более гибок в плане выполнения тестов (тогда вы больше не полагаетесь на аргументы командной строки).