【问题标题】:Call webservice method that contains hyphen调用包含连字符的 webservice 方法
【发布时间】:2018-08-10 12:52:10
【问题描述】:

我正在尝试使用 zeep 模块调用 SAP Web 服务。我们有一个名为“-CTSH-HC_RFC_XCHG_RATE_UPLOAD”的网络服务方法,当尝试调用该方法时,出现错误 “服务没有操作'_'”。由于方法名有连字符,python 不考虑连字符后的字符串。

message = client.service_-CTSH_-HC_RFC_XCHG_RATE_UPLOAD()

注意:我们无法更改 SAP Web 服务方法名称,因为 SAP 团队遵循特定的方法名称命名约定。

【问题讨论】:

  • 如果这是一个外部 python 模块,它究竟是如何设法定义一个带有连字符的方法而没有出错的?
  • 你也许应该显示此类对象的声明。你确定它是用 Python 写的吗?

标签: python zeep


【解决方案1】:

这不是有效的 Python 语法。 Python 将代码解析为:

client.service_ - CTSH_-HC_RFC_XCHG_RATE_UPLOAD()

client.service_ 和那个函数调用的减法。

您可以尝试改用getattr

method = getattr(client, "service_-CTSH_-HC_RFC_XCHG_RATE_UPLOAD")
method()   # call the method

假设zeep 没有以其他方式“规范化”无效的方法名称。


工作示例:

>>> class A:
...     pass
... 
>>> setattr(A, "service_-CTSH_-HC_RFC_XCHG_RATE_UPLOAD", lambda self: print('called'))
>>> 
>>> a = A()
>>> getattr(a, "service_-CTSH_-HC_RFC_XCHG_RATE_UPLOAD")()
called
>>> method = getattr(a, "service_-CTSH_-HC_RFC_XCHG_RATE_UPLOAD")
>>> method
<bound method <lambda> of <__main__.A object at 0x7f4651c5e518>>
>>> method()
called

【讨论】:

    【解决方案2】:

    你试过了吗?

    import client.service
    
    method_called =  __import__("_-CTSH_-HC_RFC_XCHG_RATE_UPLOAD")
    

    Reference

    【讨论】:

    • method_call = __import__("-CTSH-HC_RFC_XCHG_RATE_UPLOAD")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 2013-12-07
    • 1970-01-01
    相关资源
    最近更新 更多