Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.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 公开或隐藏依赖对象?_Python - Fatal编程技术网

Python 公开或隐藏依赖对象?

Python 公开或隐藏依赖对象?,python,Python,常见场景:我有一个使用其他库的库。例如,一个使用numpy的数学库(我们称之为foo) foo的功能可以是: 返回numpy对象(纯对象或继承的重新实现) 返回列表 返回一个行为类似于numpy(执行委托)的foo实现的对象 这三种解决方案也可以重新表述为: foo通过内部使用的对象,清楚地说明它的库依赖也是API依赖(因为它返回的对象遵循numpy库的接口) foo使用作为语言基础的一部分的对象的公共子集 foo完全隐藏了它内部使用的内容。底层库的任何内容都不会从foo库转移到客户端代码

常见场景:我有一个使用其他库的库。例如,一个使用numpy的数学库(我们称之为foo)

foo的功能可以是:

  • 返回numpy对象(纯对象或继承的重新实现)
  • 返回列表
  • 返回一个行为类似于numpy(执行委托)的foo实现的对象
这三种解决方案也可以重新表述为:

  • foo通过内部使用的对象,清楚地说明它的库依赖也是API依赖(因为它返回的对象遵循numpy库的接口)
  • foo使用作为语言基础的一部分的对象的公共子集
  • foo完全隐藏了它内部使用的内容。底层库的任何内容都不会从foo库转移到客户端代码

当然,我们正处于一种正反两方面的情况。透明还是不透明?是否与底层工具强耦合?我知道该怎么做,但我正在做这个选择,我想在做出决定之前与大家分享我的意见。非常感谢您的建议、想法和个人经验。

我想问的主要问题是,您的库中有多少会返回numpy对象?如果它是普遍的,我会直接返回一个numpy,因为你和numpy的关系如此紧密,你最好把它明确化。此外,它可能会使使用其他基于numpy的库变得更容易。另一方面,如果你只有几个方法可以返回numpy,我会选择类似numpy的对象或列表,可能是类似numpy的对象。

我想的主要问题是你的库中有多少会返回numpy对象?如果它是普遍的,我会直接返回一个numpy,因为你和numpy的关系如此紧密,你最好把它明确化。此外,它可能会使使用其他基于numpy的库变得更容易。另一方面,如果你只有几个方法可以返回numpy,我会选择类似numpy的对象或列表,可能是类似numpy的对象。

既然你说的是返回值,那就不是真正的“内部对象”——你应该只记录你返回的对象支持的接口(如果这是
numpy.array
或任何东西的一个子集就可以了;-)。我建议不要返回对内部可变属性的引用,并记录变异体可以间接改变您自己的对象(不记录也没什么好处)——这会导致将来的耦合太强


如果你说的是实际的内部对象,我建议——简单地说,如果客户机的编码
a.b.c.d.e.f()
,那么就有很大的问题(“只有一个点”有时可能是极端的,但“四个是正确的”)。同样,问题是强耦合——这使得您不可能在不中断一百万个客户端的情况下以任何微小的方式更改内部实现…!

因为您谈论的是返回值,而不是真正的“内部对象”——您应该只记录返回对象将支持的接口(如果这是
numpy.array
或任何东西的一个子集就可以了;-)。我建议不要返回对内部可变属性的引用,并记录变异体可以间接改变您自己的对象(不记录也没什么好处)——这会导致将来的耦合太强


如果你说的是实际的内部对象,我建议——简单地说,如果客户机的编码
a.b.c.d.e.f()
,那么就有很大的问题(“只有一个点”有时可能是极端的,但“四个是正确的”)。同样,问题是强耦合——这使得您不可能在不破坏一百万个客户端的情况下以任何微小的方式更改内部实现…!

+1:不要浪费时间包装或隐藏任何内容。只需返回另一个库的对象即可。s.Lott:我不知道。这似乎很吸引人,但如果另一个库出错了呢?wh如果你以后想把它修改得更好呢?如果你想修改它,而你不想修改库中的对象,而是修改你自己的对象呢?以我的经验,我很少看到库返回其他库的对象。库倾向于完全包装它们下面的对象。如果其他库出错,你就暴露了它——你暴露了screw-up——使调试成为可能。大多数Python库都是建立在其他库的基础上的,它们只是传递而已。看看urllib2是如何依赖于大量其他东西的。你不能隐藏其他人的“错误”。这是(a)不可能的和(b)的只是把问题按问题分层。+1:不要浪费时间包装或隐藏任何东西。只要归还另一个库的对象就行了。s.洛特:我不知道。这似乎很吸引人,但如果另一个库出了问题怎么办?如果你以后想把它改成更好的东西怎么办?如果你想腌制它,又不想腌制库的对象怎么办但是你自己的呢?根据我的经验,我很少看到库返回其他库的对象。库往往会完全包装它们下面的对象。如果其他库出了问题,你就暴露了它——你暴露了问题——这使得调试成为可能。大多数Python库都是建立在它们只是通过的其他库上的。看看urll是如何实现的ib2依赖于大量其他东西。你无法隐藏其他人的“错误”。这是(a)不可能的,而且(b)只是在问题上分层问题。嗯,是的。我对内部对象说得不恰当。我指的是“依赖对象”。嗯,是的。我对内部对象说得不恰当。我指的是“依赖对象”。