In Fortran you can do something like this:
JavaScript
x
6
1
#:for DTYPE, NAME in [('real','ssygvd'), ('dble', 'dsygvd'), ('cmplx', 'chegvd')]
2
3
subroutine ${DTYPE}$_something_${NAME}$(args)
4
[some commands]
5
end subroutine ${DTYPE}$_something_${NAME}$
6
Can something like this be done in Python?
I want to write a function like this for float, int and str.
JavaScript
1
16
16
1
def get_int_tuple(value):
2
try:
3
values = [int(i) for i in value.split(',')]
4
assert len(values) in range(1,4)
5
except (ValueError, AssertionError):
6
raise argparse.ArgumentTypeError(
7
'Provide a CSV list of 1 up to 3 integers'
8
)
9
10
# return our value as is if there is only one
11
if len(values) == 1:
12
return tuple(np.array(values))
13
14
# if there are three - return a range
15
return tuple(np.arange(*values))
16
Which I will then pass to the parser:
JavaScript
1
18
18
1
parser.add_argument(
2
"--kernel",
3
type=get_str_tuple,
4
help="SVM kernel. Options: 'linear', 'poly', 'rbf' (default=rbf)"
5
)
6
7
parser.add_argument(
8
'--c',
9
type=get_float_tuple,
10
help="C (hyper)parameter of 'rbf' kernel (default=0.05)."
11
)
12
13
parser.add_argument(
14
'--degree',
15
type=get_int_tuple,
16
help="Degree of the 'poly' kernel. (default=3)."
17
)
18
Advertisement
Answer
The types themselves are first-class objects, so you can pass them as arguments to a single function.
First, define a function that defines the common function, closing over the desired type.
JavaScript
1
19
19
1
def make_type(type_, type_name):
2
def get_tuple(value):
3
try:
4
values = [type_(i) for i in value.split(',')]
5
assert len(values) in range(1,4)
6
except (ValueError, AssertionError):
7
raise argparse.ArgumentTypeError(
8
f'Provide a CSV list of 1 or 3 {type_name}'
9
)
10
11
# return our value as is if there is only one
12
if len(values) == 1:
13
return tuple(np.array(values))
14
15
# if there are three - return a range
16
return tuple(np.arange(*values))
17
return get_tuple
18
19
Then use make_type
to create the necessary argument for the type
argument to `add_argument.
JavaScript
1
18
18
1
parser.add_argument(
2
"--kernel",
3
type=make_type(str, "strings"),
4
help="SVM kernel. Options: 'linear', 'poly', 'rbf' (default=rbf)"
5
)
6
7
parser.add_argument(
8
'--c',
9
type=make_type(float, "floating-point values"),
10
help="C (hyper)parameter of 'rbf' kernel (default=0.05)."
11
)
12
13
parser.add_argument(
14
'--degree',
15
type=make_tuple(int, "integers"),
16
help="Degree of the 'poly' kernel. (default=3)."
17
)
18