2015-07-21 234 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()'不需要任何比这更神奇的东西。 –