2016-03-24 54 views
1

我試圖查看是否有更高效的方式來編寫if語句。編寫一個API來根據調用該類的參數數生成一個url。需要縮小我的大如果python中的elif語句

對於防爆:

def Cars(self, model=null, color=null, miles=null) 

    if model == null and color == null and miles ==null: 
     url = cars/ 
    elif model != null and color == null and miles ==null: 
     url = cars/model=%s)% model 
    elif model != null and color != null and miles ==null: 
     url = cars/model=%s/color=%s)% model, color 
    else url = someting 

    return url 

我有超過10個參數,不想寫的所有的組合,許多elif的語句..

+1

您錯過了字符串周圍的一些引號。 –

+3

發佈的代碼是無效的Python。 –

+0

讓我們原諒我們的朋友,因爲他笨拙的代碼。 :P – Marcus

回答

8

的屬性不會出現依賴彼此;處理分別各一個:

def cars(self, model=None, color=None, miles=None) 
    url = "cars" 

    if model is not None: 
     url += "/model=%s" % (model,) 
    if color is not None: 
     url += "/color=%s" % (color,) 
    if miles is not None: 
     url += "/miles=%s" % (miles,) 

    return url 

這導致你可能要接受任意關鍵字參數,並檢查一組特定的存在的實現:

def cars(self, **kwargs): 
    url = "cars" 
    for kw in ["model", "color", "miles"]: 
     if kwargs.get(kw) is not None: 
      url += "/%s=%s" % (kw, kwargs[kw]) 
    return url 

這忽略的問題是否或者不是你正在構建的字符串,實際上是一個有效的URL。

+0

感謝您的快速響應..使用你的方法..是的,只是使用網址爲例.. –

0

也許你可以做這樣的事情:

def Cars(self, model=null, color=null, miles=null) 

    url = "cars/" 
    if (model) : 
     url += "/models=%s" % model 

    if (color) : 
     url += "/color=%s" % color 

    if (miles) : 
     url += "/miles=%s" % miles 

    return url 

在寫這種方式,你會避免使用組合數學。在你的代碼中,你將有9個if..else語句,這裏我們只有三個。

0

忽略代碼中的所有錯誤......怎麼樣:

url = "cars" 
if model: 
    url += "/model={}".format(model) 
if color: 
    url += "/color={}".format(color) 
if ... 
+0

謝謝..這只是例子不是我的實際代碼.. :))),因爲你可能已經猜到了.. –

0

如果您只是構圖您的網址,其中每個參數給出的子串的網址,你可以做這樣的事情:

url = 'http://foo.com/' 
if model is not None: 
    url += 'model={}'.format(model) 
if color is not None: 
    url += 'color={}'.format(model) 
if miles is not None: 
    url += 'miles={0:.1f}'.format(model) 

如果您不需要每個參數的任何自定義格式,你可以摺疊所有的,要這樣的:

url = 'http://foo.com/' 
for parameter in ['model', 'color', 'miles']: 
    url += '{}={}'.format(parameter, locals()[parameter]) 
0

chepner's answer(和其他人在評論中),我的想法是使用 關鍵字參數。但是,我的方法通常不是每次在循環中使用url += ...,而是將參數追加到列表中,然後在創建參數列表後使用.join()創建最終字符串。這樣我就不用擔心我是否正確地格式化字符串;我可以讓Python照顧這個頭痛的問題。

我只是發佈這個來演示一個使用相同起點的替代方法。

def cars(**kwargs): # If using as part of a class, would be cars(self, **kwargs) 
    params = [] 
    for key in kwargs.keys(): 
     # Append `key=value` to `params`. 
     if kwargs.get(key): 
      params.append('{!s}={!s}'.format(key, kwargs[key])) 
    url = '/cars?{!s}'.format('&'.join(params)) 
    return url 

print(cars(make='Ford', model='Taurus', year=2000, colors='white'))