2009-11-02 161 views
38

我來自PHP背景,想知道是否有方法在Python中執行此操作。如何避免編寫request.GET.get()兩次以打印它?

在PHP中,你可以殺死二鳥像這樣的石頭:

相反的:

if(getData()){ 
    $data = getData(); 
    echo $data; 
} 

我可以這樣做:

if($data = getData()){ 
    echo $data; 
} 

您檢查是否getData()存在如果是這樣,你可以用一個語句將它分配給一個變量。

我想知道是否有辦法在Python中做到這一點?因此,而不是這樣做:

if request.GET.get('q'): 
    q = request.GET.get('q') 
    print q 

避免編寫request.GET.get('q')兩次。

+0

你有一個Python教程書籤?哪一個? – 2009-11-02 22:03:35

+1

只是官方的一個:http://docs.python.org/tutorial/ – givp 2009-11-02 22:07:58

+2

值得慶幸的是,Python沒有該C不好的特性,而在一般情況下,在繼承了從C/C++大多數語言中,它的使用是令人難以接受的出於可讀性和清晰的原因。 – 2009-11-02 22:17:39

回答

25

也許不完全是自己所想的,但...

q = request.GET.get('q') 
if q: 
    print q 

呢?

+0

是的,沒錯。該模式是當且僅當它存在時才使用變量(這意味着它提供了一個有效值,即除* False *之外的任何值)。 – 2009-11-02 22:06:59

+0

謝謝,看起來這是最好的辦法。正如@Adam所說,用Python做這件事是不可能的。謝謝。 – givp 2009-11-02 22:08:45

+7

這種解決方案的限制是,如果你想用它在一系列if-elif的 - elif的 - elif的等。例如,看到其他SO問題:http://stackoverflow.com/questions/122277/how-do -you-翻譯此結果的正則表達式-成語-從-perl的 - 進入 - 蟒 – 2009-11-27 00:23:11

24

請參閱我的8歲配方here來完成此任務。

# In Python, you can't code "if x=foo():" -- assignment is a statement, thus 
# you can't fit it into an expression, as needed for conditions of if and 
# while statements, &c. No problem, if you just structure your code around 
# this. But sometimes you're transliterating C, or Perl, or ..., and you'd 
# like your transliteration to be structurally close to the original. 
# 
# No problem, again! One tiny, simple utility class makes it easy...: 

class DataHolder: 
    def __init__(self, value=None): self.value = value 
    def set(self, value): self.value = value; return value 
    def get(self): return self.value 
# optional but handy, if you use this a lot, either or both of: 
setattr(__builtins__,'DataHolder',DataHolder) 
setattr(__builtins__,'data',DataHolder()) 

# and now, assign-and-set to your heart's content: rather than Pythonic 
while 1: 
    line = file.readline() 
    if not line: break 
    process(line) 
# or better in modern Python, but quite far from C-like idioms: 
for line in file.xreadlines(): 
    process(line) 
# you CAN have your C-like code-structure intact in transliteration: 
while data.set(file.readline()): 
    process(data.get()) 
+29

你有一個相當聰明的8歲! ;) – unutbu 2009-11-03 03:28:08

+2

@unutbu,嘿 - 這將是我的(舊的)貓爲我的孩子是一個年紀大一點......我的小女兒的剛開始她在電信工程博士學位(先進的無線電系統,大多是)...... ;-) – 2009-11-03 04:15:41

0

那麼,這將是一個辦法

q = request.GET.get('q') 
if q: 
    print q 

一個簡短的(但並不出衆,由於調用打印無)方法是

print request.GET.get('q') or '', 
2
q = request.GET.get('q') 
if q: 
    print q 
else: 
    # q is None 
    ... 

沒有辦法一次性完成任務和條件...

+0

顯式比隱式更好。可讀性計數。特殊情況不足以打破規則。你在代碼中保存了太多的垂直空間,因爲不用除了右括號以外的任何東西寫所有這些行,爲什麼不在Python中進行清晰?就我個人而言,我在C上打了牙,並且已經寫了12年的Python代碼,而且我從未意識到這個功能缺失。你只是不需要這樣做。 – 2009-11-02 23:34:28

+0

@邁克爾:我幾乎同意所有情況。我只是在測試多個正則表達式的具體用例中缺少它,如在其他SO問題中所述:http://stackoverflow.com/questions/122277/how-do-you-translate-this-regular-expression- idiom-from-perl-into-python – 2009-11-27 00:47:50

2

如果get()方法拋出的時候它不存在異常,你可以做

try: 
    q = request.GET.get('q') 
    print q 
except : 
    pass 
9

的變化上Alex's answer

class DataHolder: 
    def __init__(self, value=None, attr_name='value'): 
     self._attr_name = attr_name 
     self.set(value) 
    def __call__(self, value): 
     return self.set(value) 
    def set(self, value): 
     setattr(self, self._attr_name, value) 
     return value 
    def get(self): 
     return getattr(self, self._attr_name) 
save_data = DataHolder() 

用法:

if save_data(get_input()): 
    print save_data.value 

,或者如果你喜歡的替代接口:

if save_data.set(get_input()): 
    print save_data.get() 

我會覺得這有助於在測試一系列的正則表達式的如果 - elif的 - elif的 - elif的等建設,爲this SO question

import re 

input = u'test bar 123' 
save_match = DataHolder(attr_name='match') 
if save_match(re.search('foo (\d+)', input)): 
    print "Foo" 
    print save_match.match.group(1) 
elif save_match(re.search('bar (\d+)', input)): 
    print "Bar" 
    print save_match.match.group(1) 
elif save_match(re.search('baz (\d+)', input)): 
    print "Baz" 
    print save_match.match.group(1) 
+0

我喜歡你將'__call __()'添加到DataHolder,但我不明白爲什麼指定'attr_name'很有用。如果DataHolder是單身人士,或者它的一個實例可以擁有多個值,每個值都有不同的屬性,我會理解,但在這裏似乎沒有強大的目的。 – 2016-06-09 15:20:00

+1

@LS:是的,我可以將它固定爲「value」或「x」。但[好的變量名稱](http://c2.com/cgi/wiki?GoodVariableNames)提高了可讀性。這是它的本質。 – 2016-06-09 23:17:46

0
config_hash = {} 
tmp_dir = ([config_hash[x] for x in ["tmp_dir"] if config_hash.has_key(x)] or ["tmp"])[0] 
print tmp_dir 
config_hash["tmp_dir"] = "cat" 
tmp_dir = ([config_hash[x] for x in ["tmp_dir"] if config_hash.has_key(x)] or ["tmp"])[0] 
print tmp_dir 
0

一個可能的方式做到這一點,沒有必要設置變量之前,可能會像:

if (lambda x: globals().update({'q':x}) or True if x else False)(request.GET.get('q')): 
    print q 

..它只是爲了好玩 - 這種方法不應該被使用,因爲它很醜陋,難以一見而知,它會創建/覆蓋全局變量(只有當條件滿足時,儘管如此)

0

只需嘗試:

print(request.GET.get('q', '')) 

基本上不輸出任何如果第一個參數不存在(見dict.get)。


替代解決方案將是使用在Python的條件表達式:

<expression1> if <condition> else <expression2> 

但你最終重複變量兩次,例如:

print(request.GET.get('q') if request.GET.get('q') else '') 

對於循環中的變量賦值,請登錄here