2

私は実際にはプログラマーではなく計算統計学者なので、複雑なアルゴリズムは理解できるかもしれませんが、単純なプログラミング構造は理解できません。

私の最初の問題は、モジュール関数が呼び出し可能かどうかを関数内でチェックすることです。私は周りを見回して、try(関数の呼び出し)- except(インポートモジュール)を使用して簡単にすることにしました。これを検索したいsys.modのですが、識別の問題が発生しています。

私の現在の問題は、モジュールから関数をインポートする方法がたくさんあるということです:import moduleは関数を として定義しますmodule.functionが、 としてfrom module import function定義しますfunction。言うまでもありませんfrom module import function as myfunction。したがって、同じ関数をいくつかの異なる方法で呼び出すことができます。

私の質問は次のとおりです。モジュールがロードされている場合にトレースできる関数の一意の「署名」はありますか? 実際の呼び出しエイリアスがあれば素晴らしいでしょう。

ps 以外にも:mod数学関数であり、ロードされたモジュールのリストを返しますが、python (2.7) は、次のようにして組み込み関数sys.modをシャドウしても文句を言いません。これは少し厄介だと思います-この種のシャドウイングをプログラムで回避する方法はありますか?modfrom sys import mod

4

3 に答える 3

3

私の最初の問題は、モジュール関数が呼び出し可能かどうかを関数内でチェックすることです。

定義上、すべての関数は呼び出し可能です。これは、オブジェクトが呼び出し可能かどうかをテストします: http://docs.python.org/library/functions.html#callable

したがって、同じ関数をいくつかの異なる方法で呼び出すことができます。

はい。ただし、同じオブジェクトになります。とが同じオブジェクトであるf is gかどうかをテストするために使用できます。fg

更新:一意の ID を使用する必要があるのはなぜですか? 真剣に、これをしないでください。同一性isテストと、__hash__適用可能なハッシュ関数を定義する方法があります。

実際の呼び出しエイリアスがあれば素晴らしいでしょう。

あなたが何を意味するのかまったくわかりませんが、常に1つのオブジェクトにしたいだけだと思います。それはすでにです。

mod は数学関数であり、sys.mod は読み込まれたモジュールのリストを返しますが、python (2.7) は from sys import mod に文句を言いません。私はこれは少し厄介だと思いますか?

それをしないでください。import ... asあなたは構文について知っています。またmod、デフォルトではグローバル名前空間にはありません (演算子%はそのためのものです)。

最後に、python は import 行について不平を言います:

>>> from sys import mod
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: cannot import name mod

(これを指摘してくれたkindallに感謝します)。

于 2012-09-14T02:32:54.610 に答える
1

次のようなモジュールがあるとします。

def foo(): pass
bar = foo

isまたはを使用すると、それらが同じ関数であることを簡単に確認できますid()

>>> import demo
>>> from demo import *
>>> demo.foo is foo
True
>>> id(demo.foo) == id(foo)
True
>>> demo.bar is foo
True

それらはすべて同じコード オブジェクトを参照しており、スコープ ディクショナリに異なる名前で格納されているだけです。

于 2012-09-14T07:00:49.243 に答える
0
# define modulus f
def mod(a,b):
    return b % a

print mod(5,2)

エイリアス:

modulus=mod
print modulus(5,2)

これは非常に Pythonic な構成であり、数学者にとっては非常に直感的です。

インポートのさまざまな方法は、後でプログラムで使用するために関数を別の「名前空間」に配置するのに役立ちます。関数を頻繁に使用したい場合は、記述が短いバリアントを選択します。

次のようなこともできます。

myat=math.atanh 

別の「名前空間」にエイリアスを作成する

そしてそれを次のように使用します:

myat(x)

それが使用するようにmath.atanh(x)- 書くのが短くなります

典型的なプログラマーのアプローチは、使用したいものをすべて定義してから使用することです。私の信念であなたがしようとしているのは、関数が必要なときに「怠惰」=>モジュールをインポートすることです。そのため、関数が「呼び出し可能」かどうかを知りたいのです。

Python は関数型プログラミング言語 (haskel など) ではないため、「オンデマンド」でロードまたは参照できます。

お役に立てれば。

于 2012-09-14T03:15:25.513 に答える