Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何重写函数定义中**kwargs的含义,使其将dict解压为函数def的默认参数?_Python_Dictionary_Scikit Learn_Keyword Argument - Fatal编程技术网

Python 如何重写函数定义中**kwargs的含义,使其将dict解压为函数def的默认参数?

Python 如何重写函数定义中**kwargs的含义,使其将dict解压为函数def的默认参数?,python,dictionary,scikit-learn,keyword-argument,Python,Dictionary,Scikit Learn,Keyword Argument,在Python中,是否可以在函数定义中解包关键字args的dict?就我所见,这是不可能的,因为有两个独立的双星语法定义。只有在调用函数时才可能解包,而在定义函数时则永远不可能解包。这是真的吗?如果是这样的话,有没有办法完成类似于我想做的事情?换句话说,我可以覆盖这个行为吗 双星有两种用法**。首先,**可用于将dict传递(并解包)到函数。第二,当定义一个函数来指示未指定数量的关键字参数时,可以使用**kwargs。据我所知,这是** 详细说明如下: 每种方法的简单示例 def print_

在Python中,是否可以在函数定义中解包关键字args的dict?就我所见,这是不可能的,因为有两个独立的双星语法定义。只有在调用函数时才可能解包,而在定义函数时则永远不可能解包。这是真的吗?如果是这样的话,有没有办法完成类似于我想做的事情?换句话说,我可以覆盖这个行为吗

双星有两种用法
**
。首先,
**
可用于将dict传递(并解包)到函数。第二,当定义一个函数来指示未指定数量的关键字参数时,可以使用
**kwargs
。据我所知,这是
**

详细说明如下:

每种方法的简单示例

def print_args(**kwargs):
    print kwargs   

print_args(one='this', two='that')
# {'two': 'that', 'one': 'this'}

def print_kw(one=None, two=None):
    print one; print two 

print_kw(**{'one':'this', 'two':'that'})
# this
# that
我想做的是:

packed_keywords = {'apple':'red', 'peach':'fuzzy'}
def print_unpacked_kw(**packed_keywords):
    print apple; print peach

print_unpacked()
# NameError: global name 'apple' is not defined 
# I'd like this to print out "red fuzzy"
为了进行比较,这里有一个类似代码的示例,没有解包。这个版本可以工作,但是没有像我所希望的那样使用关键字args的dict

def print_typed_kw(apple='red', peach='fuzzy'):     
    print apple; print peach

print_typed_kw()
# red
# fuzzy
编辑:我为什么要这样做

上下文:
这一解释对scikit learn非常具体。如果您不熟悉此库,最好忽略此上下文部分的其余部分。这个问题是在编写将进入管道的transformer类时提出的。具体来说,我正在创建一个转换器,它将从回归器返回一个预测。我的想法是将此预测用作特征联合中的一个特征,该特征联合将进入另一个下游分类器

管道的好处之一是在网格搜索中设置参数以优化超参数。根据我的经验,只有当参数在estimator类的
\uuuuu init\uuuu
构造函数中定义为参数时,才可能以这种方式访问用户定义函数的参数。这是我的班级:

class RandForestTransformer(BaseEstimator, TransformerMixin):
    """
    Takes a random forest (or could be any classifier) and uses 
    predict as output for transform, which can then be used as
    a feature in another FeatureUnion and classifier. 
    """
    def __init__(self, 
                 n_estimators=10, criterion='mse', 
                 max_depth=None, min_samples_split=2, 
                 min_samples_leaf=1, min_weight_fraction_leaf=0.0, 
                 max_features='auto', max_leaf_nodes=None, 
                 bootstrap=True, oob_score=False, n_jobs=1, 
                 random_state=None, verbose=0, warm_start=False): 
        self.rf = RandomForestRegressor()  
    def fit(self, X, y):
        self.rf = self.rf.fit(X, y)
        return self
    def transform(self, X, y=None):
        return self.rf.predict(X)
我希望能够将dict传递给
\uuuu init\uuu
定义,这样我就可以轻松地更改单个参数,而无需每次重新定义整个类

编辑2:
关于我的具体问题,我要感谢@j-a建议查看scikit learn BaseEstimator代码。

BaseEstimator的类定义明确指出,参数必须在
\uuuu init\uuuuu
中给出,在这里,参数被内省以供管道使用

class BaseEstimator(object):
    """Base class for all estimators in scikit-learn
    Notes
    -----
    All estimators should specify all the parameters that can be set
    at the class level in their ``__init__`` as explicit keyword
    arguments (no ``*args`` or ``**kwargs``).
    """   

您正在尝试将catch-all
**kwargs
参数应用到您的
局部变量
命名空间中。由于Python中的优化限制,您无法做到这一点;局部变量实际上是一个C数组,解释器通过索引查找变量(为函数生成的字节码使用索引而不是字符串来引用局部变量)

所以不,你不能这么做。你不需要这样做,因为你的函数体不是动态的。无论如何,你必须在你的函数体中引用
apple
peach
,因此如果你需要访问更多的关键字参数,你必须更新这些代码;在更新主体和函数参数列表时,这里没有区别


在更广泛的上下文中,您的
RandForestTransformer.\uuuu init\uuuu
方法不使用任何关键字参数,因此定义所有这些名称没有意义。可能是scikit learn在该方法上使用了内省来查看管道使用了哪些变量,但如果是这样,那么用
**kwargs
替换关键字参数列表也行不通,因为这将删除用于内省的一个源。

我认为您实际上不应该在函数定义中使用解包。Python非常灵活,您可以随意修改,但基本上不需要。如果不在运行时动态构建函数对象,我看不出有什么方法可以做到这一点。我也不知道你为什么要这么做!您试图解决的实际问题是什么?@jornsharpe,我的问题与构建一个可以灵活更改构造函数中关键字参数的scikit学习类有关。上面添加了详细信息。您的最后一段是正确的。我现在看到BaseEstimator类正在使用内省。有趣的是,对于这个特定的应用程序,我不需要使用函数体中的变量。我不知道为什么会这样,但这可能与sci工具包在这种情况下如何使用内省有关。