-2

a_reader 関数を使用してファイルを開きたいと思います。次に、2 番目の関数を使用してファイルを印刷したいと思います。後でファイルを開く機能を印刷せずに呼び出すことができるようにしたいので、これを行いたいと思います。これを行うための最良の方法に関するアイデアはありますか? これは動作しないことがわかっているサンプルコードですが、やりたいことを説明するのに役立つかもしれません

 def main ():        
        a_reader = open ('C:\Users\filexxx.csv','r')      
        fileName = a_reader.read()
        a_reader.close()

    def print():
        print fileName



main()
print()
4

4 に答える 4

0

「関数」にしたい場合はa_reader、変数として使用するのではなく、関数として呼び出す必要があります。では、a_reader().

Reader以下は、インスタンスa_readerを関数として呼び出すことができるクラスを実装しています。呼び出しの時点でのみ、ファイルが開かれます。他の人がすでに示したように、文字列リテラルのバックスラッシュをエスケープする"..\\.."か ( )、生の文字列を使用する( ) 必要がありr"..\.."ます。また、通常のコードを python ファイルのif __name__ == '__main__':ステートメントの下に配置することもお勧めします。これにより、(テスト) コードを呼び出さずにファイルから関数/クラスをインポートできます。

class Reader(object):
    def __init__(self, file_name):
        self._file_name = file_name
        self._fp = None

    def __call__(self):
        if self._fp:
            return self._fp
        return open(self._file_name, 'r')

def main():
    a_reader = Reader(r"C:\\Users\\filexxx.csv")
    # no file opened yet
    file_content = a_reader().read()
    a_reader().close()
    print file_content

if __name__ == '__main__': # only call main() if not imported
    main()
于 2013-05-04T08:59:21.957 に答える
0

ここで船を揺さぶるつもりはありませんが、実際には上記の2つの答えに同意します. おそらくクラスが正しい方法であり、ほぼ確実に、ネイティブの print() 関数をオーバーライドするのは賢明ではありません。

Python の強みの 1 つは、あらゆる範囲のプログラミング パラダイムをカバーしていることです。直接的な手続き型の実装が必要です - Python! コードを再利用して、一般的で再利用可能なクラス (OOP と Python) を作成したい! Python では、関数型プログラミング (Python の組み込み関数) も可能であり、関数型プログラミングのmap古典zip的な例です。

これがこの質問で求められていることだと言っているわけではありませんが、機能的にこれを行うことができます:

def my_name_function(n):
    return ' '.join(['This is my Name:', n])

def say_hello(x):
    print('Hello, world!', x)

say_hello(my_name_function('Nick'))
--> Hello, world! This is my Name: Nick

繰り返しますが、これは質問が本当に求めていることではないと思います。この場合、最適な実装は OOP の意味でのクラスであることに同意します。(おそらく、より Pythonic な方法でも :p)

しかし、Python でネストされた関数の必要性がないと言うには、Python がこのオプションを私たちに開いたままにしておくと? 最近 (ここ数年) Python が関数型プログラミングの概念への扉を開いたのはいつですか? それには長所 (と短所) があります。もしそうでなければ、慈悲深い終身独裁者としてのグイドがこの箱を開けることはなかったでしょう。

于 2013-05-04T08:17:34.537 に答える