【问题标题】:Unusable function arguments不可用的函数参数
【发布时间】:2025-12-24 10:55:15
【问题描述】:

Python 函数中是否存在用户无法访问的参数的语法。或者这甚至可能吗?

例如,我想定义一个函数,该函数接受用户的单个参数,但需要另一个参数,该函数需要在不同的设置中调用自身,例如如:

def function(userEntry, key1 = 0):
    if key1 == 0: #setting 1 
        ##SOME INITIAL OPERATIONS ##
        key1 += 1
        function(userEntry, key1)
    if key1 == 1: #setting 2
        ##FINAL OPERATIONS##
        print('Some function of ' userEntry) 

如果按照上述方式完成,用户仍然可以访问 key1 并按照他们的意愿初始化程序,但是,我不希望用户能够这样做。我希望用户仅在函数需要根据用户输入和 key1 的条件调用自身时输入 userEntry,操作会发生变化。

【问题讨论】:

  • 定义一个内部函数?
  • 你可以使用辅助函数
  • 定义内部函数可能可行,但我希望有一个简单的语法答案来定义不可用的参数。
  • 该语法如何工作?该函数如何知道是“用户”调用了它,还是另一个函数调用了它?
  • 为具有所需签名的客户端代码提供另一个功能是直接的解决方案。 Python 代码中没有私有成员,您仍然可以考虑将这些函数放在模块中,并使用下划线前缀命名内部函数。但这只是客户端代码应该尊重的约定。

标签: python function lambda functional-programming


【解决方案1】:

我同意拥有一个用户调用的单独函数是个好主意。我在这里制作了一些适用于此的代码:

key = 0

def userFunc(input):
    # Do stuff
    function(input, key)

def function(userEntry, key1 = 0):
    if key1 == 0: #setting 1 
        ##SOME INITIAL OPERATIONS ##
        print('initial operation')
        print key1
        key1 += 1
        return ##to make the function not instantly repeat itself
    if key1 == 1: #setting 2
        ##FINAL OPERATIONS##
        print('final operation')
        print key1

userFunc('inValue')

这将在第一次调用 userFunc() 时执行初始操作,然后在下次调用时执行最终操作。

【讨论】:

    【解决方案2】:

    在调用你在其他地方使用的实际函数之前,有一个最终用户调用的函数,它可以满足它的需要。

    def userFunc(input):
        # Do stuff
        function(input, key)
    
    def function
        # Does common functionality
    

    【讨论】:

      【解决方案3】:

      根据您的最新评论,您可能想要这样的东西:

      class OffsetedIncrementer:
          _offset = 100
      
          def __init__(self, offset=100):
              OffsetedIncrementer._offset = offset
      
          def inc(self, x):
              return x + 1 + OffsetedIncrementer._offset
      
      
      oi = OffsetedIncrementer(200)
      func = oi.inc
      
      print(func(2))
      

      输出:

      203
      

      【讨论】:

      • 谢谢,我最终确实在一个内部实现了两个功能。但这种方式似乎也很干净。不过,作为 Python 的新手,我尽量避免在类中使用全局变量。
      • @Semzem,避免共享状态不适合新手,实际上是一个好习惯。但有时共享状态是有意义的,当你真的需要在一个类的所有实例之间共享某些东西时。如果没有,并且有一些特定于每个实例的配置,只需将其传递给__init__ 并在每个实例中单独分配self._offset = offset