9

Pythonで強力な型の遺伝的プログラミングを実装しようとしています。

これらのサンプルのようなものはありますか?

def funcA(a,b):
  return a + b
return_type(funcA)

output: <class 'Integer'>

def funcA(a,b):
  return a + b
parameter_type(funcA)

output: [<class 'Integer'>,<class 'Integer'>]

アップデート:

私はpythonの式を生成しようとしていますが、次のように評価できないものを避けています:

funcA(20, funcA(True, "text"))
4

7 に答える 7

13

動的型付け言語である Python では、実行時に関数のパラメーターの型情報が必要です。3.3 以降では、次のように関数の型を取得できます。

from inspect import signature
def foo(a, *, b:int, **kwargs):
...     pass

sig = signature(foo)

str(sig)
'(a, *, b:int, **kwargs)'

str(sig.parameters['b'])
'b:int'

sig.parameters['b'].annotation
<class 'int'>

https://docs.python.org/3/library/inspect.html#introspecting-callables-with-the-signature-objectを参照してください

于 2018-05-04T18:35:17.567 に答える
8

Python 3 では関数アノテーションが導入されています。それ自体では何もしませんが、独自の強制を書くことができます:

def strict(fun):
    # inspect annotations and check types on call

@strict
def funcA(a: int, b: int) -> int:
    return a + b 
于 2013-03-04T11:08:14.103 に答える
4

Pythonでは、呼び出しが実行されてreturnステートメントが実行されるまで、戻り値のタイプはわかりません。状況によって異なる場合もあるため、簡単な答えは「不可能」です。

特定の関数の戻り型を知る必要がある場合でも、戻り型を公開する可能性のある型チェックコードにラップすることができます。ただし、それはかなり非Python的です:

def declare_return_type(t):
    def decorator(f):
        def wrapper(*a, **kw):
            res = f(*a, **kw)
            assert isinstance(res, t)
            return res
        wrapper.return_type = t
        return wrapper
    return decorator

@declare_return_type(int)
def f(a, b):
    return a + b

print f.return_type

print f(1, 2) # ok
f('a', 'b') # Assertion error

UPD:パラメータタイプにも同じことをして、それらをチェックすることができます。

于 2013-03-04T11:14:43.710 に答える
2

最良の方法は、docstrings を使用して関数のそのような情報を保存することです。

In [49]: def funcA(a,b):
   ....:     ''' returns an int '''
   ....:     return int(a+b)
   ....:

In [50]: funcA.__doc__
Out[50]: ' returns an int '
于 2013-03-04T11:06:56.960 に答える
0

チャンスは無い。Python はダック タイピングを使用するため、int と int、str と str など、さまざまなタイプのパラメーターを funcA に渡すことができます。実際のパラメーターを見ずに、戻り値の型とパラメーターの型が何であるかを知る機会はありません

于 2013-03-04T11:06:11.383 に答える
0

整数に対してのみ有効であることを考えると、関数だけから知ることは不可能です。整数パラメータで呼び出す場合:

funcA(1, 2)

3、整数を取得しますが、これはどうですか:

funcA("Test", "Test")

あなた"TestTest"は文字列を取得します!これは技術的には機能しますが、そのように使用する必要があるかどうかは、提供するコードには存在しない情報です。

より現代的な Python では、注釈は、この種の情報を明示的に述べる可能性を提供します。または、既存の使用法または関数のコードからそれを推測しようとする可能性がありますが、それらのオプション (もしあれば) のどれがあなたの使用に意味がありますか?ケースは、やりたいことの詳細に大きく依存します。

于 2013-03-04T11:08:49.867 に答える