2010-12-07 10 views
4

ここに私が求めている質問の序章があります:私は私の会社のためにPythonでゲートウェイに依存しない支払いAPIを構築しました。現時点では、Authorize.netをサポートするためのコードしか書いておらず、Pythonプログラマーの私のAPI設計の明快さに関するいくつかのフィードバックを、Iよりも少し経験したいと思っていました。これはPythonのAPI設計戦略ですか?

私は自分自身をロールしました。存在感があると思っている人や、Authorize.net特有のものです(私はもっとクリーンなインターフェースでより一般的なパッケージを書いています)。私は特にパッケージ(pythorize)からインスピレーションを得ましたが、そのAPIが嫌いでした。

私がやっていることを説明する前に、パッケージのbitbucketの公開リポジトリへのリンクは次のとおりです:paypy(コードは安定していますが、文書はひどく欠けています。

私の現在の戦略は、ネストされた辞書を使用して、それを支払いメソッドクラスのコンストラクタに渡すことです。 Authorize.net CIMのAPIで新しいユーザープロファイルを作成する例:

>>> options = {'tran_key' : 'test_tran_key', 
...   'login' : 'developer_login', 
...   'testing' : True, 
...   'validation': 'testMode', 
...   'customer': {'description': 'Some description of the customer profile', 
...       'id'   : 22, 
...       'email'  : '[email protected]'}, 
...   'billing': [{'type': 'individual', 
...       'profile': {'city'  : 'Carlsbad', 
...          'state'  : 'California', 
...          'zip'  : '92009', 
...          'firstname' : 'John', 
...          'address' : '12 Alicante Rd. Suite 9', 
...          'lastname' : 'Doe', 
...          'country' : 'USA', 
...          'phone'  : '(858) 557-2674'}, 
...       'payment': {'card': {'ccv'  : '524', 
...            'number'  : '4111111111111111', 
...            'expiration' : '2014-04'}}}, 
...      {'type' : 'individual', 
...       'profile' : {'city'  : 'Las Vegas', 
...          'state'  : 'Nevada', 
...          'zip'  : '79112', 
...          'firstname' : 'John', 
...          'address' : '78 Cloud Front', 
...          'lastname' : 'Doe', 
...          'country' : 'USA', 
...          'phone'  : '(858) 557-2674'}, 
...       'payment': {'card': {'ccv'  : '499', 
...            'number'  : '4111111111111111', 
...            'expiration' : '2012-11'}}}, 
...      {'profile': {'city'  : 'Carlsbad', 
...          'state'  : 'California', 
...          'zip'  : '92009', 
...          'firstname' : 'John', 
...          'address' : '12 Alicante Rd. Suite 9', 
...          'lastname' : 'Doe', 
...          'company' : 'Xmarks', 
...          'country' : 'USA', 
...          'phone'  : '(858) 557-2674'}, 
...       'payment': {'bank': {'name_on_account' : 'John Doe', 
...            'account'   : '829330184383', 
...            'type'   : 'checking', 
...            'name'   : 'Bank of America', 
...            'routing'   : '122400724'}}}], 
...   'shipping': [{'city'  : 'Carlsbad', 
...       'state'  : 'California', 
...       'zip'  : '92009', 
...       'firstname' : 'John', 
...       'address' : '12 Alicante Rd. Suite 9', 
...       'lastname' : 'Doe', 
...       'country' : 'USA', 
...       'phone'  : '(858) 557-2674'}]} 
>>> profile = Profile(options) 
>>> result = profile.create() 
>>> result.code 
'I00001' 
>>> print 'Customer Profile ID:' + str(result) 
Customer Profile ID: 2758851 
>>> print 'Customer Payment Profile IDs:' + repr(result.payment_ids) 
Customer Payment Profile IDs: ['2380878', '2380879', '2380880'] 
>>> print 'Customer Shipping Profile IDs:' + repr(result.shipping_ids) 
Customer Shipping Profile IDs: ['2427568'] 
>>> 
>>> 
>>> options = {'id'  : str(result), 
...   'tran_key' : '86U5pvA9TcxZ5b8D', 
...   'testing' : True, 
...   'login' : '5b3PhGX68'} 
>>> profile = Profile(options) 
>>> result = profile.remove() 
>>> result.code 
'I00001' 
>>> ^D 

あなたは、私が使う魔法のメソッドのカップルわかります(strのよう、など...)結果オブジェクトのために。私はAIMやARBメソッドの辞書戦略を使って、支払いAPIに "オプション"を伝える最も簡単な方法だと思っていました.-ある時点で、GoogleCheckout、Paypalなどのアダプターがあるでしょう。

私が持っていたもう一つの考えは、ディクショナリの代わりにディスクリプタとオブジェクトを使用してオプションデータをアダプタに伝えることでした。

すべてのペイメントゲートウェイAPI(特にPayPalとAuthorize.net)と同様に、インターフェイスはちょっと面倒な傾向があり、どのような方法でも標準化されていないため、一部のゲートウェイ依存オプションを回避することは困難です。

+1

なぜこれを対話型コンソールで行ったのですか? –

+0

私は実際にはしませんでした。これはテストの抜粋です。コードとその結果を対話形式のプロンプトで出力したように書式を設定したので、理解しやすくなります。 – Ixmatus

+2

これはjsonのようです。 jsonと互換性がありますか?これはかなり標準的なAPIであると私は思います。 – Falmarri

答えて

3

深く入れ子になった辞書は、Pythonでは珍しくないかもしれませんし、おそらく彼らは "Pythonic"ですが、地獄は良いアイデアではないので、私はPythonicではないと主張します。

私はクラスのネストされた階層を作ります。それははるかに明確になるだろう、IMO、また型チェックを行うことができるという利点がある。

実際、私はおそらくそれを行うためにいくつかのスキーマモジュールを使用します。

どのようにそのデータを入力する必要がありますか?人々はPythonコードで合理的にタイプするとは思われません。

+0

これらは珍しいことではありませんが、入れ子にされた辞書が分かりにくくなり、構造が正式なものより素朴で推測されたスキーマに従うので、「正しい」と感じません。 答えに感謝し、私の疑惑を確認しました。私はオブジェクト - > xmlとxml->オブジェクトシリアライザについて考えました... REデータ入力:それはHTMLフォームを介してキャプチャされています。プログラマは指定されたフォーム入力からdictを作成します適切に名前のついたフォームフィールドを使って自動的に行うことができます)。 – Ixmatus

+0

Zope3スキーマ(インタフェースあり)は、私が探している答えかもしれないようです。 – Ixmatus

+1

実際、彼らは非常に良いかもしれません。 Zope Component Architectureは一般に素晴らしいですが、おそらく使い方が簡単ではありません。 –

関連する問題