2015-07-21 231 views
1

什麼是正確的(pythonic)方法來做這樣的事情?如果有東西存在,請用東西做點什麼

var = 'The quick brown fox' 

def exists(query, string): 
    if query in string: 
     return query 
    else: 
     return None 

if thing = exists('fox', var): 
    print(thing.upper()) 

這是我的例子,但我真正想做的是檢查Selenium網元是否存在。我想避免將結果設置爲變量,因爲這會破壞「存在」的目的。此外,我不想執行搜索兩次,第一次返回true/false,如果是,則使用它執行某些操作。

+1

你怎麼能使用的事情,如果你從來沒有定義的呢?另外你將如何執行搜索兩次? –

+0

'print(* [item.upper()for item'in''fox'] if item in var] [0:])'? ...是的,只需按照上面的建議保存變量即可。 – TigerhawkT3

+0

我經常做'temp = filedialog.askopenfilename()','如果temp:use_filename(temp)''。 – TigerhawkT3

回答

1

這是其中有多種方法可以做到的其中一種情況。有幾件事情你可以做:

  1. 結果視爲零到一個元素的集合(它更有意義,如果你把它像find_one在這種情況下):

    def find_one(query, string): 
        if query in string: 
         return [query] 
        return [] 
    

    然後您可以使用該功能在for循環:

    for existing_element in find_one(query, string): 
        # Do something with existing element 
        break 
    else: 
        # Here if we don't have any elements (note the `break` above) 
    
  2. 傳遞一個回調的第一個參數:

    def if_exists(cb, query, string): 
        if query in string: 
         cb(query) 
    
    def run_on_valid_query(q): 
        # Do something with q 
    
    if_exists(run_on_valid_query, query, string) 
    
  3. 硬着頭皮使用一箇中間變量:

    result = extract_from(query, string) 
    if result: # Do work here 
    
+0

我會仔細考慮這一點。非常感謝! – bkvaluemeal

+0

有沒有一種方法的回調,而不是一個點符號函數?例如:'result.cb()'其中'cb'是通常可以在'result'上執行的函數。 – bkvaluemeal

+0

在這一點上,你只是處理一個正則函數,如果你只是調用結果的方法,如果它存在:'def do_if_exists(query,doc):result = doc.find(query);如果結果如下:result.some_method()'不需要任何比這更神奇的東西。 –