Implementing GetDynamicMemberNames() for PyObject (#690)
* Implementing GetDynamicMemberNames() for PyObject * Added unit test * Addressing code review comments
This commit is contained in:
Родитель
f60dc32439
Коммит
545c5490ae
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче