(我回答我自己的問題,我不知道這是在b est的方式,但我想留下一個代碼,我試圖記錄。)
基於polpak的答案,我寫了下面的代碼。我想這會滿足我提出的條件。該函數是迂腐的,因爲它拒絕任何其他類型的輸入參數,而不是float scaling或float ndarray。 (也許它甚至不接受各種浮點ndarray。)特別是,它拒絕整數縮放器和整數ndarray以及複雜的縮放器和複雜的ndarray。
#!/usr/bin/python
import numpy as np
import types
def foo(vara):
"""vara must be a real-valued scaler or ndarray."""
real_types = [types.FloatType, np.float16, np.float32, np.float64, np.float128]
print '----------'
print 'vara:', vara
if isinstance(vara, np.ndarray):
if not any(vara.dtype==t for t in real_types):
print 'NG.'
print ' type(vara)=', type(vara)
print ' vara.dtype=', vara.dtype
# raise an error here
else:
print 'OK.'
print ' type(vara)=', type(vara)
print ' vara.dtype=', vara.dtype
else:
if not any(isinstance(vara, t) for t in real_types):
print 'NG.'
print ' type(vara)=', type(vara)
# raise an error here
else:
print 'OK.'
print ' type(vara)=', type(vara)
varalist=[3.0,
np.array([0.5, 0.2]),
np.array([3, 4, 1]),
np.array([3.4+1.2j, 0.8+0.7j]),
np.array([3.4+0.0j, 0.8+0.0j]),
np.array([1.3, 4.2, 5.9], dtype=complex),
np.array([1.3, 4.2, 5.9], dtype=complex).real ]
for vara in varalist:
foo(vara)
該代碼的輸出如下。
$ ./main003.py
----------
vara: 3.0
OK.
type(vara)= <type 'float'>
----------
vara: [ 0.5 0.2]
OK.
type(vara)= <type 'numpy.ndarray'>
vara.dtype= float64
----------
vara: [3 4 1]
NG.
type(vara)= <type 'numpy.ndarray'>
vara.dtype= int64
----------
vara: [ 3.4+1.2j 0.8+0.7j]
NG.
type(vara)= <type 'numpy.ndarray'>
vara.dtype= complex128
----------
vara: [ 3.4+0.j 0.8+0.j]
NG.
type(vara)= <type 'numpy.ndarray'>
vara.dtype= complex128
----------
vara: [ 1.3+0.j 4.2+0.j 5.9+0.j]
NG.
type(vara)= <type 'numpy.ndarray'>
vara.dtype= complex128
----------
vara: [ 1.3 4.2 5.9]
OK.
type(vara)= <type 'numpy.ndarray'>
vara.dtype= float64
只是要清楚,你是否想禁止複雜的論點,也沒有虛部? '2 + 0j'會被禁止嗎? – DSM
我認爲最好禁止複雜的論點與他們的想象部分零。我想確保該函數的用戶知道該函數僅用於實際變量。如果用戶意識到這一點並且確定被傳遞的變量的虛部爲零,那麼他/她可以通過'.real'來取實部。 – norio