try: # python 2.x import unittest2 as unittest except ImportError: # python 3.x import unittest import doctest import sys import funcsigs as inspect class TestFunctionSignatures(unittest.TestCase): @staticmethod def signature(func): sig = inspect.signature(func) return (tuple((param.name, (Ellipsis if param.default is param.empty else param.default), (Ellipsis if param.annotation is param.empty else param.annotation), str(param.kind).lower()) for param in sig.parameters.values()), (Ellipsis if sig.return_annotation is sig.empty else sig.return_annotation)) def test_zero_arguments(self): def test(): pass self.assertEqual(self.signature(test), ((), Ellipsis)) def test_single_positional_argument(self): def test(a): pass self.assertEqual(self.signature(test), (((('a', Ellipsis, Ellipsis, "positional_or_keyword")),), Ellipsis)) def test_single_keyword_argument(self): def test(a=None): pass self.assertEqual(self.signature(test), (((('a', None, Ellipsis, "positional_or_keyword")),), Ellipsis)) def test_var_args(self): def test(*args): pass self.assertEqual(self.signature(test), (((('args', Ellipsis, Ellipsis, "var_positional")),), Ellipsis)) def test_keywords_args(self): def test(**kwargs): pass self.assertEqual(self.signature(test), (((('kwargs', Ellipsis, Ellipsis, "var_keyword")),), Ellipsis)) def test_multiple_arguments(self): def test(a, b=None, *args, **kwargs): pass self.assertEqual(self.signature(test), (( ('a', Ellipsis, Ellipsis, "positional_or_keyword"), ('b', None, Ellipsis, "positional_or_keyword"), ('args', Ellipsis, Ellipsis, "var_positional"), ('kwargs', Ellipsis, Ellipsis, "var_keyword"), ), Ellipsis)) def test_has_version(self): self.assertTrue(inspect.__version__) def test_readme(self): doctest.testfile('../README.rst') def test_unbound_method(self): if sys.version_info < (3,): self_kind = "positional_only" else: self_kind = "positional_or_keyword" class Test(object): def method(self): pass def method_with_args(self, a): pass self.assertEqual(self.signature(Test.method), (((('self', Ellipsis, Ellipsis, self_kind)),), Ellipsis)) self.assertEqual(self.signature(Test.method_with_args), (( ('self', Ellipsis, Ellipsis, self_kind), ('a', Ellipsis, Ellipsis, "positional_or_keyword"), ), Ellipsis)) if __name__ == "__main__": unittest.begin()