code: def test_has_arg(self):
      # fn is callable / is not callable
  
      class FooNotCallable:
          def __init__(self, word):
              self.message = word
  
      class FooCallable:
          def __init__(self, word):
              self.message = word
  
          def __call__(self, message):
              return message
  
          def positional_argument_call(self, arg1):
              return self.message
  
          def multiple_positional_arguments_call(self, *args):
              res = []
              for a in args:
                  res.append(a)
              return res
  
          def keyword_argument_call(self, filter_=True):
              res = self.message
              if filter_:
                  res = "KO"
              return res
  
          def multiple_keyword_arguments_call(self, arg1="1", arg2="2"):
              return self.message + arg1 + arg2
  
          def undefined_keyword_arguments_call(self, **kwargs):
              res = self.message
              for a in kwargs:
                  res = res + a
              return a
  
      foo_callable = FooCallable("OK")
      self.assertTrue(has_arg(foo_callable, "message"))
  
      if sys.version_info < (3,):
          foo_not_callable = FooNotCallable("KO")
          self.assertFalse(has_arg(foo_not_callable, "message"))
      elif sys.version_info < (3, 6):
          with self.assertRaises(TypeError):
              foo_not_callable = FooNotCallable("KO")
              has_arg(foo_not_callable, "message")
  
      # Python 2, argument in / not in valid arguments / keyword arguments
      if sys.version_info < (3,):
          self.assertFalse(has_arg(foo_callable, "invalid_arg"))
          self.assertTrue(
              has_arg(foo_callable.positional_argument_call, "arg1")
          )
          self.assertFalse(
              has_arg(
                  foo_callable.multiple_positional_arguments_call,
                  "argX",
              )
          )
          self.assertFalse(
              has_arg(foo_callable.keyword_argument_call, "argX")
          )
          self.assertTrue(
              has_arg(foo_callable.keyword_argument_call, "filter_")
          )
          self.assertTrue(
              has_arg(
                  foo_callable.multiple_keyword_arguments_call, "arg2"
              )
          )
          self.assertFalse(
              has_arg(
                  foo_callable.multiple_keyword_arguments_call, "arg3"
              )
          )
          self.assertFalse(
              has_arg(
                  foo_callable.undefined_keyword_arguments_call, "argX"
              )
          )
      # Python 3, argument in / not in valid arguments / keyword arguments
      elif sys.version_info < (3, 6):
          self.assertFalse(has_arg(foo_callable, "invalid_arg"))
          self.assertTrue(
              has_arg(foo_callable.positional_argument_call, "arg1")
          )
          self.assertFalse(
              has_arg(
                  foo_callable.multiple_positional_arguments_call,
                  "argX",
              )
          )
          self.assertFalse(
              has_arg(foo_callable.keyword_argument_call, "argX")
          )
          self.assertTrue(
              has_arg(foo_callable.keyword_argument_call, "filter_")
          )
          self.assertTrue(
              has_arg(
                  foo_callable.multiple_keyword_arguments_call, "arg2"
              )
          )
          self.assertFalse(
              has_arg(
                  foo_callable.multiple_keyword_arguments_call, "arg3"
              )
          )
          self.assertFalse(
              has_arg(
                  foo_callable.undefined_keyword_arguments_call, "argX"
              )
          )
      else:
          self.assertFalse(has_arg(foo_callable, "invalid_arg"))
          self.assertTrue(
              has_arg(foo_callable.positional_argument_call, "arg1")
          )
          self.assertFalse(
              has_arg(
                  foo_callable.multiple_positional_arguments_call,
                  "argX",
              )
          )
          self.assertFalse(
              has_arg(foo_callable.keyword_argument_call, "argX")
          )
          self.assertTrue(
              has_arg(foo_callable.keyword_argument_call, "filter_")
          )
          self.assertTrue(
              has_arg(
                  foo_callable.multiple_keyword_arguments_call, "arg2"
              )
          )
          self.assertFalse(
              has_arg(
                  foo_callable.multiple_keyword_arguments_call, "arg3"
              )
          )
          self.assertFalse(
              has_arg(
                  foo_callable.undefined_keyword_arguments_call, "argX"
              )
          )
      # argname is None
      self.assertFalse(has_arg(foo_callable, None))
  
imports: import unittest
  import sys
  from lime.utils.generic_utils import has_arg
label_desc: Use image node_id 1 for calling the TestGenericUtils obj's underlying member method code with example usage: obj.test_has_arg() and returns: message, self, res, res, unknown, a