8000 allow user-created instances of PySequence and PyIterable · pythonnet/pythonnet@c1653f5 · GitHub
[go: up one dir, main page]

Skip to content

Commit c1653f5

Browse files
committed
allow user-created instances of PySequence and PyIterable
1 parent 0355ebc commit c1653f5

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

src/runtime/pyiterable.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,18 @@ internal PyIterable(IntPtr ptr) : base(ptr)
1313
internal PyIterable(BorrowedReference reference) : base(reference) { }
1414
internal PyIterable(in StolenReference reference) : base(reference) { }
1515

16+
/// <summary>
17+
/// Creates new instance from an existing object.
18+
/// </summary>
19+
/// <remarks>This constructor does not check if <paramref name="o"/> is actually iterable.</remarks>
20+
public PyIterable(PyObject o) : base(FromObject(o)) { }
21+
22+
static BorrowedReference FromObject(PyObject o)
23+
{
24+
if (o is null) throw new ArgumentNullException(nameof(o));
25+
return o.Reference;
26+
}
27+
1628
/// <summary>
1729
/// Return a new PyIter object for the object. This allows any iterable
1830
/// python object to be iterated over in C#. A PythonException will be

src/runtime/pysequence.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#nullable enable
12
using System;
23

34
namespace Python.Runtime
@@ -14,6 +15,18 @@ public class PySequence : PyIterable
1415
internal PySequence(BorrowedReference reference) : base(reference) { }
1516
internal PySequence(in StolenReference reference) : base(reference) { }
1617

18+
/// <summary>
19+
/// Creates new instance from an existing object.
20+
/// </summary>
21+
/// <exception cref="ArgumentException"><paramref name="o"/> does not provide sequence protocol</exception>
22+
public PySequence(PyObject o) : base(FromObject(o)) { }
23+
24+
static BorrowedReference FromObject(PyObject o)
25+
{
26+
if (o is null) throw new ArgumentNullException(nameof(o));
27+
if (!IsSequenceType(o)) throw new ArgumentException("object is not a sequence");
28+
return o.Reference;
29+
}
1730

1831
/// <summary>
1932
/// Returns <c>true</c> if the given object implements the sequence protocol.

0 commit comments

Comments
 (0)
0