summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Heger <2sn@users.noreply.github.com>2023-02-12 00:26:42 +1100
committerCharles Harris <charlesr.harris@gmail.com>2023-02-13 18:13:30 -0700
commitefcb0fbd138294fa362628ab1c8567255e374fd8 (patch)
tree4e93f118739a296dd0d1936a2a338105ac7a4dae
parent6829a6fe91da59bc83e3f10f2c5695d2ba8b109f (diff)
downloadnumpy-efcb0fbd138294fa362628ab1c8567255e374fd8.tar.gz
BUG: fix for f2py string scalars (#23194)
in previous version, any string scalar was converted to a string array of dimension len, i.e., a definition character(len=N) :: X effectively became character(len=NNN), dimension(NNN) :: X from the point of few of the numpy (python) interface: X.shape == (NNN,) X.dtype == '|SNNN' Closes gh-23192
-rw-r--r--numpy/f2py/capi_maps.py6
-rw-r--r--numpy/f2py/tests/src/string/scalar_string.f907
-rw-r--r--numpy/f2py/tests/test_character.py20
3 files changed, 30 insertions, 3 deletions
diff --git a/numpy/f2py/capi_maps.py b/numpy/f2py/capi_maps.py
index f07066a09..aaae3a8e0 100644
--- a/numpy/f2py/capi_maps.py
+++ b/numpy/f2py/capi_maps.py
@@ -342,9 +342,9 @@ def getstrlength(var):
def getarrdims(a, var, verbose=0):
ret = {}
if isstring(var) and not isarray(var):
- ret['dims'] = getstrlength(var)
- ret['size'] = ret['dims']
- ret['rank'] = '1'
+ ret['size'] = getstrlength(var)
+ ret['rank'] = '0'
+ ret['dims'] = ''
elif isscalar(var):
ret['size'] = '1'
ret['rank'] = '0'
diff --git a/numpy/f2py/tests/src/string/scalar_string.f90 b/numpy/f2py/tests/src/string/scalar_string.f90
new file mode 100644
index 000000000..d847668bb
--- /dev/null
+++ b/numpy/f2py/tests/src/string/scalar_string.f90
@@ -0,0 +1,7 @@
+MODULE string_test
+
+ character(len=8) :: string
+
+ character(len=12), dimension(5,7) :: strarr
+
+END MODULE string_test
diff --git a/numpy/f2py/tests/test_character.py b/numpy/f2py/tests/test_character.py
index b54b4d981..a5cfffe0d 100644
--- a/numpy/f2py/tests/test_character.py
+++ b/numpy/f2py/tests/test_character.py
@@ -568,3 +568,23 @@ class TestMiscCharacter(util.F2PyTest):
assert_equal(len(a), 2)
assert_raises(Exception, lambda: f(b'c'))
+
+
+class TestStringScalarArr(util.F2PyTest):
+ sources = [util.getpath("tests", "src", "string", "scalar_string.f90")]
+
+ @pytest.mark.slow
+ def test_char(self):
+ out = self.module.string_test.string
+ expected = ()
+ assert out.shape == expected
+ expected = '|S8'
+ assert out.dtype == expected
+
+ @pytest.mark.slow
+ def test_char_arr(self):
+ out = self.module.string_test.strarr
+ expected = (5,7)
+ assert out.shape == expected
+ expected = '|S12'
+ assert out.dtype == expected