2017-01-27 8 views
0

私に電子メールで私にリンクするスクリプトがあります。ラムダ関数はオブジェクト値を印刷する代わりに値を出力しません

<function <lambda> at 0x7f75b5fb4a60> 

のように私のスクリプトが見えます:

:エラーがこの行(私は信じている)上で発生している

from bs4 import BeautifulSoup 
import re 
import requests 

ex_webdev_js_by_city = [ 
'http://boston.website.org/search/web', 
] 

ex_web_j_keywords = [['one'],['coool', 'person']] 
ex_web_j_keywords = sum(ex_web_j_keywords, []) 

ex_js = [] 

for webdev_j_for_a_city in ex_webdev_js_by_city: 
    webdev_j = requests.get(webdev_j_for_a_city) 
    soup = BeautifulSoup(webdev_j.text, "lxml") 
    for j_keyword in ex_web_j_keywords: 
     for a in soup.find_all('a', class_="result-title hdrlnk", text=re.compile(j_keyword,re.IGNORECASE)): 
      #print(a.get('href')) 
      ex_js.append(a.get('href')) 

if ex_js: 
    #email them to myself! 
    import smtplib, socket 
    TO = '[email protected]' 

    try: 
     server = smtplib.SMTP('smtp.gmail.com', 587) 
     server.starttls() 
     TEXT = lambda: print(('Latest js from site:\n\n{}'*len(ex_js)).format(*ex_js)) 
     #Gmail Sign In 
     gmail_sender = 'myemail' 
     gmail_passwd = 'mypass' 
     server.login(gmail_sender, gmail_passwd) 
     msg = str(TEXT) 
     server.sendmail(gmail_sender, gmail_sender, msg) 
     print('Sent you some links!') 
     server.quit() 
    except socket.error as e: 
     print ('error sending mail, error was {}'.format(e)) 

問題ではなく、私が得る、リンクが含まアレントです

lambda: print(('Latest js from site:\n\n{}'*len(ex_js)).format(*ex_js)) 

0123私に電子メールでがあり、valueではありません。

ここで、私はおそらく何が間違っていますか?

+1

まず第一に、あなたの問題の変更を固定するためにTEXT()

を呼び出すことによって、それを起動する必要があります実行するためには、値が "'あなた以来NONE'です"print"文を返します。そして第二に、なぜlambdaを使用しますか? –

+0

'lambda'関数は決して呼び出されないので何もしません。 –

答えて

4

とにかくprintまたはlambdaを使用する理由はわかりません。あなたは、単に書いた場合:

msg = ('Latest js from site:\n\n{}'*len(ex_js)).format(*ex_js) 

とドロップ:

msg = str(TEXT) 

それはおそらく動作するはずです。

のでtryブロックは次のようになります。

server = smtplib.SMTP('smtp.gmail.com', 587) 
server.starttls() 
msg = ('Latest js from site:\n\n{}'*len(ex_js)).format(*ex_js) 
#Gmail Sign In 
gmail_sender = 'myemail' 
gmail_passwd = 'mypass' 
server.login(gmail_sender, gmail_passwd) 
# msg = str(TEXT) !!commented out!! (only to make it explicit) 
server.sendmail(gmail_sender, gmail_sender, msg) 
print('Sent you some links!') 
server.quit()

を、私はあなたが本当に行うことになっているものlambdaprint理解していないことが考えています。 printを使用して標準出力チャネルにデータを書きますが、電子メールに書き込むので、ローカルで印刷する必要はありません。メッセージをメモリに保存する必要があります。あなたはそれを任意の引数を供給していない場合は最後にlambda:...

は、無名関数を作成するために使用され、その使用量は(怠惰を達成するために、たとえば)の実行を延期することが通常です。しかし、ここでは実際ににメッセージが必要なので、ここでもこの構文を使用する必要はありません。

+0

'msg = str(TEXT)'をコメントアウトすると思いますか? – Jshee

+0

@Jshee:コメントアウトまたは削除します。確かに、私の悪い...ごめんなさい。 –

+0

これは本当に役に立ちます。だから、 'format()'を使うには 'print()'のような関数を呼び出す必要はありませんか? – Jshee

1

あなたはヨは、単にラムダ関数を作成している

TEXT = lambda: print(('Latest js from site:\n\n{}'*len(ex_js)).format(*ex_js)) 

を言うとき、それはまだ実行されていません。あなたは、具体的

TEXT = lambda: ('Latest js from site:\n\n{}'*len(ex_js)).format(*ex_js) 

そしてmsg = str(TEXT())

+0

ラムダが必要ないと思っていますが、これはオーバーヘッドを導入するだけです... –

+0

'' lambda''関数で 'return'を使わないでください。式の結果は暗黙的に返されます。そして、ええ、この場合には、ラムダは必要ありません。 @ShadowRanger。 – ShadowRanger

+0

真実。回答が更新されました。 – gipsy

関連する問題