Элегантное кодирование для необязательных аргументов и выводов в Python - PullRequest
0 голосов
/ 24 апреля 2018

Мне было интересно, есть ли более элегантный способ написания следующей функции без использования операторов if или менее операторов if. В зависимости от выбранного аргумента я хочу, чтобы функция возвращала разные переменные.

X = np.ones((3,3))
def calculate(X, output2=False, output3=False):
    y1=X*2
    y2=X*3
    y3=X*4

    if (output2==False and output3==False):
        return y1
    if (output2==True and output3==False):
        return y1,y2
    if (output2==False and output3==True):
        return y1,y3
    if (output2==True and output3==True):
        return y1,y2,y3


out1, out3=calculate(X, output3=True) 

Ответы [ 3 ]

0 голосов
/ 24 апреля 2018

Возвращаемые значения основаны на маске.Вы можете выяснить, что возвращать, перебирая значения y и значения mask с zip.

def calculate(X, output2=False, output3=False):   
    ...
    mask = [True, output2, output3]
    y = [y1, y2, y3]
    return [i for i, j in zip(y, mask) if j]

out1, out3 = calculate(X, output3=True)

out1
array([[2., 2., 2.],
       [2., 2., 2.],
       [2., 2., 2.]])

out3
array([[4., 4., 4.],
       [4., 4., 4.],
       [4., 4., 4.]])

Если вы возвращаете только один элемент, вам нужно небольшое изменение.Вот пример:

out1, *_ = calculate(X, output3=False)
0 голосов
/ 24 апреля 2018
X = np.ones((3,3))
def calculate(X, output2=False, output3=False):
    y1=X*2
    y2=X*3
    y3=X*4

    options = {(0,0):y1,
            (1,0):(y1,y2),
            (0,1):(y1,y3),
            (1,1):(y1,y2,y3)}

    return options.get((output2,output3),(None,None))

out1, out3=calculate(X, output3=True) 


[[ 2.  2.  2.]
 [ 2.  2.  2.]
 [ 2.  2.  2.]]
[[ 4.  4.  4.]
 [ 4.  4.  4.]
 [ 4.  4.  4.]]
0 голосов
/ 24 апреля 2018

Создайте возвращаемый элемент кортежа за элементом, затем исключите кортеж, если есть только один элемент:

retval = (stuff_always_returned,)
if output2:
    retval += (more_stuff,)
if output3:
    retval += (even_more_stuff,)

if len(retval) == 1:
    return retval[0]
return retval

Вы также можете избежать вычисления частей вывода, которые вам не нужны, с помощьюперемещая эти вычисления в соответствующие if ветви.

retval = (stuff_always_returned,)
if output2:
    more_stuff = compute_more_stuff()
    retval += (more_stuff,)
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...