updated for version 7.3.1047
Problem:    Python: dir() does not work properly.
Solution:   Python patch 8.  Add __dir__ method to all objects with custom
            tp_getattr supplemented by __members__ attribute for at least
            python-2* versions.  __members__ is not mentioned in python-3*
            dir() output even if it is accessible. (ZyX)
diff --git a/src/testdir/test86.in b/src/testdir/test86.in
index 267657c..45c345f 100644
--- a/src/testdir/test86.in
+++ b/src/testdir/test86.in
@@ -691,6 +691,24 @@
     cb.append(expr + ':' + attr + ':' + repr(type(eval(expr)) is getattr(vim, attr)))
 EOF
 :"
+:" Test __dir__() method
+py << EOF
+for name, o in (
+        ('current',    vim.current),
+        ('buffer',     vim.current.buffer),
+        ('window',     vim.current.window),
+        ('tabpage',    vim.current.tabpage),
+        ('range',      vim.current.range),
+        ('dictionary', vim.bindeval('{}')),
+        ('list',       vim.bindeval('[]')),
+        ('function',   vim.bindeval('function("tr")')),
+        ('output',     sys.stdout),
+    ):
+    cb.append(name + ':' + ','.join(dir(o)))
+del name
+del o
+EOF
+:"
 :" Test exceptions
 :fun Exe(e)
 :   execute a:e
diff --git a/src/testdir/test86.ok b/src/testdir/test86.ok
index efa8001..f44ebf7 100644
--- a/src/testdir/test86.ok
+++ b/src/testdir/test86.ok
@@ -382,6 +382,15 @@
 vim.current.range:Range:True
 vim.current.window:Window:True
 vim.current.tabpage:TabPage:True
+current:__dir__,__members__,buffer,line,range,tabpage,window
+buffer:__dir__,__members__,append,mark,name,number,options,range,valid,vars
+window:__dir__,__members__,buffer,col,cursor,height,number,options,row,tabpage,valid,vars
+tabpage:__dir__,__members__,number,valid,vars,window,windows
+range:__dir__,__members__,append,end,start
+dictionary:__dir__,__members__,keys,locked,scope
+list:__dir__,__members__,extend,locked
+function:__call__,__dir__,__members__,softspace
+output:__dir__,__members__,flush,softspace,write,writelines
 (<class 'vim.error'>, error('abc',))
 (<class 'vim.error'>, error('def',))
 (<class 'vim.error'>, error('ghi',))
diff --git a/src/testdir/test87.in b/src/testdir/test87.in
index 8f70fcf..210c055 100644
--- a/src/testdir/test87.in
+++ b/src/testdir/test87.in
@@ -669,6 +669,24 @@
     cb.append(expr + ':' + attr + ':' + repr(type(eval(expr)) is getattr(vim, attr)))
 EOF
 :"
+:" Test __dir__() method
+py3 << EOF
+for name, o in (
+        ('current',    vim.current),
+        ('buffer',     vim.current.buffer),
+        ('window',     vim.current.window),
+        ('tabpage',    vim.current.tabpage),
+        ('range',      vim.current.range),
+        ('dictionary', vim.bindeval('{}')),
+        ('list',       vim.bindeval('[]')),
+        ('function',   vim.bindeval('function("tr")')),
+        ('output',     sys.stdout),
+    ):
+    cb.append(name + ':' + ','.join(dir(o)))
+del name
+del o
+EOF
+:"
 :" Test exceptions
 :fun Exe(e)
 :   execute a:e
diff --git a/src/testdir/test87.ok b/src/testdir/test87.ok
index c04d220..3b39c18 100644
--- a/src/testdir/test87.ok
+++ b/src/testdir/test87.ok
@@ -371,6 +371,15 @@
 vim.current.range:Range:True
 vim.current.window:Window:True
 vim.current.tabpage:TabPage:True
+current:__dir__,buffer,line,range,tabpage,window
+buffer:__dir__,append,mark,name,number,options,range,valid,vars
+window:__dir__,buffer,col,cursor,height,number,options,row,tabpage,valid,vars
+tabpage:__dir__,number,valid,vars,window,windows
+range:__dir__,append,end,start
+dictionary:__dir__,keys,locked,scope
+list:__dir__,extend,locked
+function:__call__,__dir__,softspace
+output:__dir__,flush,softspace,write,writelines
 (<class 'vim.error'>, error('abc',))
 (<class 'vim.error'>, error('def',))
 (<class 'vim.error'>, error('ghi',))