用于调用NBP(波兰国家银行)Web API的实用程序包。

NB的Python项目详细描述


https://travis-ci.org/kuszaj/nbpy.svg?branch=master

一个实用程序包,用于调用{a2},并使用其汇率将各种货币转换为波兰兹罗提。

nbpy需要python 3.3或更新版本

安装

来自PYPI:

$ pip3 install nbpy

源代码:

$ git clone https://github.com/kuszaj/nbpy
$ cd nbpy
$ python3 setup.py install

用法

nbpy提供一个NBPClient类,用于生成api调用方,给定可用的货币代码:

>>>importnbpy>>>#: Available currencies>>>nbpy.currencies{'EUR':NBPCurrency(Euro,code=EUR,tables={'A','C'}),'USD':NBPCurrency(UnitedStatesdollar,code=USD,tables={'A','C'}),...}>>>nbp=nbpy.NBPClient('eur')>>>nbpNBPClient(USD,as_float=False,suppress_errors=False,cache_size=128)>>>nbp.currency_code='EUR'>>>nbpNBPClient(EUR,as_float=False,suppress_errors=False,cache_size=128)

currency_code必须是来自nbpy.currencies的可用代码之一,否则NBPClient将引发UnknownCurrencyCode

>>>fromnbpy.errorsimportUnknownCurrencyCode>>>'XYZ'innbpy.currenciesFalse>>>try:...nbp.currency_code='XYZ'...exceptUnknownCurrencyCode:...print('XYZ is unknown')...XYZisunknown

api调用

NBPClient中定义的所有api调用都返回NBPExchangeRate对象或列出其实例。

.current()返回当前货币汇率。请注意,这并不一定意味着今天:对于周末、假日和波兰国家银行方法返回最后可用值的官方公告之前。

>>>nbp.current()NBPExchangeRate(EUR->PLN,2017-10-31,mid=4.2498)>>>#: Calling NBPClient object is synonymous with current()>>>nbp()NBPExchangeRate(EUR->PLN,2017-10-31,mid=4.2498)

.today()返回当前日期的汇率(如果可用)。 否则,将引发APIError

>>>nbp.today()NBPExchangeRate(EUR->PLN,2017-10-31,mid=4.2498)...>>>#: A day later, during national holiday>>>fromnbpy.errorsimportAPIError>>>try:...nbp.today()...exceptAPIError:...print("No data available")...Nodataavailable

.date(date)返回给定日期的汇率(如果可用)。否则,将引发APIError。参数date必须是datetime.datetime或格式正确的日期字符串(YYYY-MM-DD),否则方法将引发DateFormattingError

>>>fromnbpy.errorsimportAPIError,DateFormattingError>>>nbp.date('2017-10-02')NBPExchangeRate(EUR->PLN,2017-10-02,mid=4.3137)>>>try:...nbp.date('2017-10-01')...exceptAPIError:...print("No data available for date")...Nodataavailablefordate>>>try:...nbp.date('01/10/17')...exceptDateFormattingError:...print("Improperly formatted date string")...Improperlyformatteddatestring

.last(n)返回最后一个n可用汇率,按日期升序排列。

>>>nbp.last(3)[NBPExchangeRate(EUR->PLN,2017-10-27,mid=4.2520),NBPExchangeRate(EUR->PLN,2017-10-30,mid=4.2403),NBPExchangeRate(EUR->PLN,2017-10-31,mid=4.2498)]

.date_range(start_date, end_date)返回给定日期范围[start_date, end_date]的汇率,按日期升序排序。这两个参数的限制方式与date()方法的date相同。

如果范围超过93天,则方法将引发APIError

>>>fromnbp.errorsimportAPIError>>>nbp.date_range('2017-10-01','2017-10-14')[NBPExchangeRate(EUR->PLN,2017-10-02,mid=4.3137),NBPExchangeRate(EUR->PLN,2017-10-03,mid=4.3105),NBPExchangeRate(EUR->PLN,2017-10-04,mid=4.3025),...]>>>try:...nbp.date_range('2017-01-01','2017-06-01')...exceptAPIError:...print('Invalid date range')...Invaliddaterange

出价/要价

默认情况下,所有api调用方法都返回平均汇率(mid)。但是,通过传递bid_ask=True,您还可以获得bid/ask值。并不是每种货币都有它们:在这种情况下,bid_ask被忽略。

>>>nbp()NBPExchangeRate(EUR->PLN,2017-10-31,mid=4.2498)>>>nbp(bid_ask=True)NBPExchangeRate(EUR->PLN,2017-11-02,bid=4.2036,ask=4.2886)>>>#: No bid/ask values for CUP>>>nbp.currency_code='CUP'>>>nbp()NBPExchangeRate(CUP->PLN,2017-10-31,mid=3.6529)>>>fromnbpy.errorsimportBidAskUnavailable>>>try:...nbp(bid_ask=True)...exceptBidAskUnavailable:...print('Bid/ask unavailable')...Bid/askunavailable

抑制误差

如果您希望api调用总是返回某些内容,尽管api可能有问题,您可以将suppress_errors=True传递给NBPClient。启用此标志时,API调用而不是引发^{TT29}$,并且^{TT10}$异常将返回^{TT31}$。

>>>fromnbp.errorsimportAPIError>>>try:...nbp.date_range('2017-01-01','2017-06-01')...exceptAPIError:...print('Invalid date range')...Invaliddaterange>>>nbp.suppress_errors=True>>>print(nbp.date_range('2017-01-01','2017-06-01'))None

缓存大小

为了提高效率,NBPClient通过保存最后128个调用来利用lru缓存。可以通过将cache_size传递给NBPClient来更改此值。此值只能在对象初始化期间设置。

>>>nbp=NBPClient('eur',cache_size=64)>>>nbpNBPClient(EUR,as_float=False,suppress_errors=False,cache_size=64)>>>try:...nbp.cache_size=128...exceptAttributeError:...print("Can't overwrite cache_size")...Can't overwrite cache_size

浮动利率

默认情况下,所有汇率都被解析为decimal.Decimal对象。您可以通过传递as_float=True来更改此行为,这将强制将所有汇率解析为float

>>>nbp=NBPClient('eur')>>>type(nbp().mid)<class'decimal.Decimal'>>>>nbp=NBPClient('eur',as_float=True)>>>type(nbp().mid)<class'float'>

汇率

NBPClient调用返回一个NBPExchangeRate对象(它们的列表),该对象可以用作计算波兰兹罗提的给定外币金额的转换器。

>>>exchange_rate=nbp()>>>exchange_rateNBPExchangeRate(EUR->PLN,2017-10-31,mid=4.2498)>>>amount=1000>>>exchange_rate(amount){'mid':Decimal('4249.8000')}>>>exchange_rate*amount{'mid':Decimal('4249.8000')}>>>amount*exchange_rate{'mid':Decimal('4249.8000')}>>>>>>exchange_rate=nbp(all_values=True)>>>exchange_rateNBPExchangeRate(EUR->PLN,2017-11-02,bid=4.2036,ask=4.2886)>>>exchange_rate(amount){'bid':Decimal('4204.3000'),'ask':Decimal('4289.3000')}

示例

下面的脚本打印并汇总外币发票列表。

fromdatetimeimportdatetime,timedeltafromdecimalimportDecimalfromnbpyimportNBPClientfromnbpy.errorsimportAPIErrorclassInvoice(object):"""Invoice class with builtin currency converter."""def__init__(self,currency_code,date,amount):self.currency_code=currency_codeself.date=dateself.amount=Decimal("{:.2f}".format(amount))self._nbp=NBPClient(currency_code)@propertydefamount_in_pln(self):exchange_rate=Nonedate=datetime.strptime(self.date,'%Y-%m-%d')whileexchange_rateisNone:# Get exchange rates until valid is foundtry:exchange_rate=self._nbp.date(date.strftime('%Y-%m-%d'))breakexceptAPIError:date-=timedelta(days=1)amount=(exchange_rate*self.amount)['mid']returnround(amount,2)# List of invoices in foreign currenciesinvoices=[Invoice('EUR','2017-10-03',650.0),Invoice('EUR','2017-10-06',890.0),Invoice('USD','2017-10-11',1230.0),]# Print all amounts in their currencies and PLNtemplate="{currency}    {amount:7.2f}  {amount_in_pln:7.2f}"forinvoiceininvoices:print(template.format(currency=invoice.currency_code,amount=invoice.amount,amount_in_pln=invoice.amount_in_pln,))# Sum all values in PLN# Since amount_in_pln were already called, script will use cached values# instead of calling NBP Web APIsum_amount_in_pln=sum([invoice.amount_in_plnforinvoiceininvoices])print("-"*23)print("        total: {sum:8.2f}".format(sum=sum_amount_in_pln))# EUR     650.00  2801.82# EUR     890.00  3830.74# USD    1230.00  4454.94# -----------------------#         total: 11087.50

许可证

MIT

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何复制二维字符串数组?   java Realworld参数优化   输入创建一个Java程序,读取。txt并标识三角形边长   java Apache HttpClient上传后文件无法与MultipartEntityBuilder上传一起使用   java如何从单独的类文件中随机选择两个枚举值   Java获取两个正则表达式之间所有字符串的最佳方法?   java如何将按钮链接到微调器?   java改造2.0:如何映射不同类型的对象   java如何检查Antlr3中的数字范围?   java使用JNDI查找EJB Bean   java构造函数字符串、字符串、int、int、Optional<>在spring boot中未定义   java如何使用jruby(使用jetty运行)创建servlet?   JavaFX:为什么在背景改变之前我必须按下按钮几次?   java可以为违反映射契约的映射生成重复的JSON对象属性名吗?   JavaJSOUP从网站获取某些属性   Eclipse:如何使java文件夹显示为树?   如何在Java中从Matcher获取多个正则表达式组?   构造函数中带有参数的lambda Java 8供应商   java是否可以在ExtJS 3.2中对日期进行自定义排序