Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ This document follows the conventions laid out in [Keep a CHANGELOG][].

### Added

- use enum name in repr

### Changed

### Fixed
Expand Down
37 changes: 37 additions & 0 deletions src/runtime/Types/ClassObject.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,43 @@ internal NewReference GetDocString()
}


/// <summary>
/// given an enum, write a __repr__ string formatted in the same
/// way as a python repr string. Something like:
/// '&lt;Color.GREEN: 2&gt;';
/// with a binary value for [Flags] enums
/// </summary>
/// <param name="inst">Instace of the enum object</param>
/// <returns></returns>
private static string getEnumReprString(object inst)
Comment thread
koubaa marked this conversation as resolved.
Outdated
{
var obType = inst.GetType();

var isFlags = obType.IsFlagsEnum();
var intValue = Convert.ToInt32(inst);
Comment thread
koubaa marked this conversation as resolved.
Outdated
var intStr = isFlags ? "0x" + intValue.ToString("X4") : intValue.ToString();
Comment thread
koubaa marked this conversation as resolved.
Outdated

var repr = $"<{obType.Name}.{inst}: {intStr}>";
return repr;
}

/// <summary>
/// ClassObject __repr__ implementation.
/// </summary>
public new static NewReference tp_repr(BorrowedReference ob)
{
if (GetManagedObject(ob) is not CLRObject co)
{
return Exceptions.RaiseTypeError("invalid object");
}
if (co.inst.GetType().IsEnum)
{
return Runtime.PyString_FromString(getEnumReprString(co.inst));
}

return ClassBase.tp_repr(ob);
}

/// <summary>
/// Implements __new__ for reflected classes and value types.
/// </summary>
Expand Down
10 changes: 10 additions & 0 deletions tests/test_enum.py
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,16 @@ def test_enum_undefined_value():
Test.FieldTest().EnumField = Test.ShortEnum(20, True)


def test_enum_repr():
"""Test enumeration repr."""
from System import DayOfWeek

assert repr(DayOfWeek.Monday) == "<DayOfWeek.Monday: 1>"

assert repr(Test.FlagsEnum(7)) == "<FlagsEnum.Two, Five: 0x0007>"
assert repr(Test.FlagsEnum(8)) == "<FlagsEnum.8: 0x0008>"


def test_enum_conversion():
"""Test enumeration conversion."""
ob = Test.FieldTest()
Expand Down