text: # PR#192, dir(func) and dir(method) returning []
  
  def test1():
      'Test function 1'
      pass
  
  def test2(a, b=2, c=3):
      pass
  
  attrs = dir(test1)[:]
  for attr in ['__doc__', '__name__', 'func_code', 'func_defaults',
               'func_doc', 'func_globals', 'func_name']:
      attrs.remove(attr)
  assert not attrs
  
  assert test1.__doc__ == test1.func_doc == 'Test function 1'
  assert test1.__name__ == test1.func_name == 'test1'
  assert test1.func_code
  assert test1.func_defaults is None
  assert test1.func_globals == globals()
  assert test2.func_defaults == (2, 3)
  
  co = test2.func_code
  attrs = dir(co)[:]
  for attr in ['co_name', 'co_argcount', 'co_varnames', 'co_filename',
               'co_firstlineno', 'co_flags']:
      attrs.remove(attr)
  ##assert not attrs
  
  flags = 0x4 | 0x8
  
  assert co.co_name == 'test2'
  assert co.co_argcount == 3
  assert co.co_varnames == ('a', 'b', 'c')
  assert co.co_filename
  assert co.co_firstlineno
  assert (co.co_flags & flags) == 0
  
  def test3(a, *args, **kw):
      pass
  
  assert (test3.func_code.co_flags & flags) == flags
  
  class Foo:
      def method(self):
          """This is a method"""
          pass
  
  attrs = dir(Foo.method)[:]
  for attr in ['im_self', 'im_func', 'im_class', '__doc__', '__name__']:
      attrs.remove(attr)
  assert not attrs
  
  assert Foo.method.im_self is None
  assert Foo.method.im_class == Foo
  assert Foo.method.im_func
  assert Foo.method.im_func.__name__ == Foo.method.__name__
  assert Foo.method.im_func.__doc__ == Foo.method.__doc__
  
  f = Foo()
  m = f.method
  assert m.im_self == f
  assert m.im_class == Foo
  assert m.im_func == Foo.method.im_func
  assert m.__name__ == Foo.method.__name__
  assert m.__doc__ == Foo.method.__doc__
  
  class Baz:
      pass
  
  try:
      m.im_class = Baz
      assert 0
  except TypeError:
      pass
  
  try:
      m.im_stuff = 7
      assert 0
  except AttributeError:
      pass
  