2010-11-22 18 views
4

が一つの問題のための余分な信用の上に、私のpythonに新たなんだ、と私はLearning Python the Hard WayだコードPythonでは、この3行のコードをどのようにして1行のコードにすることができますか?ここで

from sys import argv 
script,from_file, to_file = argv 
open(to_file,'w').write(open(from_file).read()) 

だ、それは本の作家は長いコード1行を作ることができたと言い、私はそれを3行に減らすことができましたが、私は立ち往生しています。

手助けをしますか?

ああ、コードはあるファイルの内容を別のファイルにコピーするか、それを意味します。それが私の目標です。

+4

"Bad Python the Stupid Wayを学ぶ"は、時間をかけてコードを1行に収めることを奨励するものにとって、より良いタイトルになります。 –

+0

"ケアを助ける?"いいえ。コードゴルフは悪いことです。今は止めろ。 –

+0

あなたのコードは非常にきれいです! shutilモジュールとargparseモジュールも参照してください。 –

答えて

9

それは、セミコロンを必要とすることなく、すなわち1つの表現としてこれを行うことが可能です。もちろん

__import__('shutil').copy(__import__('sys').argv[1], __import__('sys').argv[2]) 

または

open(__import__('sys').argv[2], "w").write(open(__import__('sys').argv[1]).read()) 

、彼らの権利念頭に置いて誰もにこれを好むないだろうサンプルコード。私はなるだろう唯一の変更は、一時的な変数にファイル名を割り当てるする理由はありませんということです。これを書いている

from sys import argv 
open(argv[1],'w').write(open(argv[2]).read()) 

よりPython的な方法は、次のようになります。

import sys 
with open(sys.argv[1]) as src, open(sys.argv[2]) as dest: 
    for line in src: 
     dest.write(line) 

、その後、あなたが使用して開始することができますあなたができる@katrielalexの複数__import__を避けるために...コマンドラインをより強固に読ん

+0

+1これは、1行でこれを行う方法です。必要に応じて...そして、もちろん、誰もそれを使用する必要はありません;) – Ant

+0

ありがとう!私はそれを1行に書くようにする意図は、前にその方法を知らなかったので、arg値を直接参照することを学ぶことだと思います。私は2行で十分だと思います。プログラマは彼の醜い1ライナーを保つことができます。 –

-2
import sys 

open(sys.argv[3], 'w').write(open(sys.argv[2]).read()) 

おそらくあなたができることは最高です。

+0

-1これは問題を1行に減らさないためです.b)答えができないということは偽です。 –

+0

OK @ブライアンは質問者に 'from sys import argv; open(argv [2]、 'w')。write(open(argv [1])。read()) 'は良いpythonのセマンティクスです。 –

+0

私は問題が良いセマンティクスではないと思います。これは、「私は行数を減らしたい」という人ではなく、「問題点を解決しています。一つの問題は、これら3つの行を1つにする」ということです。私はそれが悪い習慣であることに同意するだろうが、それはポイントの横にある。時々人々は間違ったやり方を見なければならないので、なぜそれが間違っているのか正確に経験するでしょう。 –

6

セミコロンを使用すると、import文を同じ行に保存できます。また、変数を使用する代わりに、argvの項目を直接参照してください。

from sys import argv; open(argv[2],'w').write(open(argv[1]).read()) 
+0

これはコード行ではありません...これは不正行為です;)と深刻なマニュアルは、この手引きを奨励すべきではありません。 – Ant

+1

@Ant - はい、私は同意します! –

0

2番目の行を削除して、argvを3番目に直接参照することができます。残りの行を結合するには、セミコロンを使用します。これはまあまあですが、sysをインポートする必要があるので、私はもっと良い解決策はありません。あなたが知っている必要があり

from sys import argv; open(argv[2],'w').write(open(argv[1]).read()) 
+1

なぜそれは浮気だと思いますか?明らかに唯一のルールは "それを1本にする"ことです。ルールは「それを1つの表現にする」ことではありません。 –

+0

それはそれが愚かな謎になるからです。謎の人が@katrielalex – kichik

+0

@Bryan okで提供されている答えのような1つのステートメントを要求していますが、マニュアルはPythonを教えることになっています。悪いPythonではありません – Ant

3

2つのこと:

1)あなたは、セミコロンで区切ることにより、同じ行に複数のPythonの文を含めることができますが

2)あなたは、移動する必要はありませんコマンドラインパラメータを別々の変数にまとめて使用することができます。

+0

私は本当にこの答えが一番好きです。それは実際にそれを離れさせずに問題を解決するのに十分な詳細を説明します。質問をしている人が学ぶことを試みているので、ツールを提供するのではなくツールを提供する方がよい。 –

+0

ありがとうございます。私はまた、これらの1ライナーが恐ろしいことを指摘している他のポスターをエコーし​​たいと思う。 – bgporter

1

を作るためにargparse

(lambda a:open(a[2],"w").write(open(a[1]).read()))(__import__('sys').argv)

短くても、醜いです。

0

私もこれを学んでいます。

from_file, to_file = raw_input("copy from: "), raw_input("copy to: ") 

open(to_file, 'w').write(open(from_file).read()) 
関連する問題