2

重複の可能性:
Python関数のソースコードを取得するにはどうすればよいですか?

まず、私の問題を定義しましょう。あとでやる気を出します。

問題:

def map(doc):
  yield doc['type'], 1

# How do I get the textual representation of the function map above,
# as in getting the string "def map(doc):\n  yield doc['yield'], 1"?
print repr(map)  # Does not work. It prints <function fun at 0x10049c8c0> instead.

動機:

CouchDBビューに精通している方のために、私はPythonスクリプトを作成してCouchDBビューを生成しています。これは、マップを含むJSONであり、関数が埋め込まれています。例えば、

{
  "language": "python",
  "views": {
    "pytest": {
      "map": "def fun(doc):\n  yield doc['type'], 1",
      "reduce": "def fun(key, values, rereduce):\n  return sum(values)"
    }
  }
}

ただし、読みやすくするために、最初にPythonスクリプトでネイティブに関数を記述してmapからreduce、この質問への回答を使用して上記のJSONを作成することをお勧めします。

解決:

BrenBarnの応答により、を使用しますinspect.getsource

#!/usr/bin/env python

import inspect

def map(doc):
  yield doc['type'], 1

def reduce(key, values, rereduce):
  return sum(values)

couchdb_views = {
  "language": "python",
  "views": {
     "pytest": {
       "map": inspect.getsource(map),
       "reduce": inspect.getsource(reduce),
     }
  }
}

# Yay!
print couchdb_views
4

1 に答える 1

3

関数を使用して、inspect.getsource関数のソースを取得できます。これが機能するためには、関数をファイルからロードする必要があることに注意してください(たとえば、インタラクティブインタプリタで定義された関数では機能しません)。

于 2012-09-17T01:18:16.587 に答える