Implementing GetDynamicMemberNames() for PyObject (#690)

* Implementing GetDynamicMemberNames() for PyObject

* Added unit test

* Addressing code review comments
This commit is contained in:
jbw3 2018-06-18 11:49:55 -05:00 коммит произвёл Denis Akhiyarov
Родитель f60dc32439
Коммит 545c5490ae
5 изменённых файлов: 80 добавлений и 0 удалений

Просмотреть файл

@ -28,6 +28,7 @@
-   Jeff Reback ([@jreback](https://github.com/jreback))
- Joe Frayne ([@jfrayne](https://github.com/jfrayne))
- John Burnett ([@johnburnett](https://github.com/johnburnett))
- John Wilkes ([@jbw3](https://github.com/jbw3))
- Luke Stratman ([@lstratman](https://github.com/lstratman))
- Konstantin Posudevskiy ([@konstantin-posudevskiy](https://github.com/konstantin-posudevskiy))
- Matthias Dittrich ([@matthid](https://github.com/matthid))

Просмотреть файл

@ -16,6 +16,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][].
- Added `clr.GetClrType` (#432, #433)
- Allowed passing `None` for nullable args (#460)
- Added keyword arguments based on C# syntax for calling CPython methods (#461)
- Implemented GetDynamicMemberNames() for PyObject to allow dynamic object members to be visible in the debugger (#443)
### Changed

Просмотреть файл

@ -93,6 +93,7 @@
<Compile Include="TestPyList.cs" />
<Compile Include="TestPyLong.cs" />
<Compile Include="TestPyNumber.cs" />
<Compile Include="TestPyObject.cs" />
<Compile Include="TestPySequence.cs" />
<Compile Include="TestPyString.cs" />
<Compile Include="TestPythonException.cs" />

Просмотреть файл

@ -0,0 +1,61 @@
using System;
using System.Collections.Generic;
using System.Linq;
using NUnit.Framework;
using Python.Runtime;
namespace Python.EmbeddingTest
{
public class TestPyObject
{
[OneTimeSetUp]
public void SetUp()
{
PythonEngine.Initialize();
}
[OneTimeTearDown]
public void Dispose()
{
PythonEngine.Shutdown();
}
[Test]
public void TestGetDynamicMemberNames()
{
List<string> expectedMemberNames = new List<string>
{
"add",
"getNumber",
"member1",
"member2"
};
PyDict locals = new PyDict();
PythonEngine.Exec(@"
class MemberNamesTest(object):
def __init__(self):
self.member1 = 123
self.member2 = 'Test string'
def getNumber(self):
return 123
def add(self, x, y):
return x + y
a = MemberNamesTest()
", null, locals.Handle);
PyObject a = locals.GetItem("a");
IEnumerable<string> memberNames = a.GetDynamicMemberNames();
foreach (string expectedName in expectedMemberNames)
{
Assert.IsTrue(memberNames.Contains(expectedName), "Could not find member '{0}'.", expectedName);
}
}
}
}

Просмотреть файл

@ -1,5 +1,6 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Dynamic;
using System.Linq.Expressions;
@ -1238,5 +1239,20 @@ namespace Python.Runtime
result = CheckNone(new PyObject(res));
return true;
}
/// <summary>
/// Returns the enumeration of all dynamic member names.
/// </summary>
/// <remarks>
/// This method exists for debugging purposes only.
/// </remarks>
/// <returns>A sequence that contains dynamic member names.</returns>
public override IEnumerable<string> GetDynamicMemberNames()
{
foreach (PyObject pyObj in Dir())
{
yield return pyObj.ToString();
}
}
}
}