件名はかなりばかげているように聞こえるので、いくつかのコードを示します。
def foo(**kwargs):
# How can you detect the difference between (**{}) and ()?
pass
foo(**{})
foo()
fooの内部を検出する方法はありますか、メソッドはどのように呼び出されましたか?
アップデート1
なぜあなたが何かをしたいのかというコメントがいくつかあったので、いくつかの背景を説明しようと思います。
super(MyClass, self).foo(*args, **kwargs)吸う-多くの無駄な複製。'self.super()'を書きたい。この場合、スーパークラスを呼び出して、呼び出し元のメソッドが取得したすべてのパラメーターも渡します。チャームのように機能します。
今問題のある魔法の部分:
'self.super(something)'と言いたいのですが、この場合、'something'だけがsuperメソッドに渡されます。ほとんどの場合に機能します。
これはそれが壊れるところです:
def foo(self, fnord=42, *args, **kwargs):
self.super(*args, **kwargs)
*argsしたがって、スーパーメソッドは、呼び出し元のメソッド**kwargsが空であるという引数を取得する必要があります。ただし、現在、ライブラリはこの条件を検出できず、「fnord」を含むすべての引数を渡します。
もちろんself.super.foo(*args, **kwargs)、代替構文として使用することもできますが、それは不十分です:-)
PS:はい、私はp3kのスーパーを知っていますが、それでも良くなく、Python2.xでは動作しません...
アップデート2
実際、Pythonのastモジュールでさえ**{}(ast.parse('foo(**{})'))を削除しているため、これは解析プロセスの非常に早い段階で発生するため、後でこの情報を取得することはできません...
したがって、最終的には、その特定の問題をあきらめるか(AmbiguousSyntaxErrorを発生させる)、〜unutbuによって提案されたテキスト解析を使用する必要があります。私のアプローチを再考すると、後者は実際に実行可能かもしれません。なぜなら、それがself.super(\s*)、であるかどうかを知る必要があるだけだからself.super(\S+)です。