【问题标题】:How to launch getattr function in python with additional parameters?如何在 python 中使用附加参数启动 getattr 函数?
【发布时间】:2011-09-13 09:31:42
【问题描述】:

我想通过 getattr 函数添加参数来调用一些未知函数。有可能吗?

【问题讨论】:

    标签: python getattr


    【解决方案1】:

    是的,但你不要将它们传递给getattr();一旦你引用了这个函数,你就可以正常调用它。

    getattr(obj, 'func')('foo', 'bar', 42)
    

    【讨论】:

      【解决方案2】:

      如果您希望使用参数/关键字参数的动态列表调用动态方法,您可以执行以下操作:

      function_name = 'wibble'
      args = ['flip', 'do']
      kwargs = {'foo':'bar'}
      
      getattr(obj, function_name)(*args, **kwargs)
      

      【讨论】:

      • 感谢额外的 kwargs 方法。
      【解决方案3】:

      要调用的函数

      import sys
      
      def wibble(a, b, foo='foo'):
          print(a, b, foo)
          
      def wibble_without_kwargs(a, b):
          print(a, b)
          
      def wibble_without_args(foo='foo'):
          print(foo)
          
      def wibble_without_any_args():
          print('huhu')
      
      
      # have to be in the same scope as wibble
      def call_function_by_name(function_name, args=None, kwargs=None):
          if args is None:
              args = list()
          if kwargs is None:
              kwargs = dict()
          getattr(sys.modules[__name__], function_name)(*args, **kwargs)
      
          
      call_function_by_name('wibble', args=['arg1', 'arg2'], kwargs={'foo': 'bar'})
      call_function_by_name('wibble_without_kwargs', args=['arg1', 'arg2'])
      call_function_by_name('wibble_without_args', kwargs={'foo': 'bar'})
      call_function_by_name('wibble_without_any_args')
      # output:
      # arg1 arg2 bar
      # arg1 arg2
      # bar
      # huhu
      

      【讨论】:

      • 不要在函数声明中设置空列表或字典,因为它们会立即计算。
      • @SunnyPatel:不同意。使用空列表和 dict 声明, call_function_by_name 更通用。您可以在没有 kwargs、args 甚至没有任何参数的情况下调用函数。我修改了我的答案以明确这一点。
      • @mGran,Sunny 指出这样做是一种反模式。关于为什么在函数声明中设置一个空列表/dict/etc 的实例并没有像许多人认为的那样做,以及为什么它会咬你,有很多讨论。我建议看看其中的一些讨论。例如stackoverflow.com/questions/26320899/…stackoverflow.com/questions/1132941/… 以确保您了解这样做的含义。
      • @Zeb 你说得有道理。我编辑了答案。
      猜你喜欢
      • 2021-08-29
      • 2019-11-02
      • 2016-03-26
      • 2014-05-13
      • 1970-01-01
      • 2019-02-20
      • 1970-01-01
      • 2013-02-05
      • 2016-10-17
      相关资源
      最近更新 更多