Pergunta
Como funciona essa importação, o arquivo que ele usa?
import _functools
Em Python 2.5:
import _functools
print _functools.__file__
Dá:
Traceback (most recent call last):
File "D:\zjm_code\mysite\zjmbooks\a.py", line 5, in <module>
print _functools.__file__
AttributeError: 'module' object has no attribute '__file__'
Como posso obter o significado do parcial (de _functools importar parcial) se eu não conseguir ler o código C?
Solução
módulos C-codificados pode ser incorporado (__file__
falta) ou ao vivo em uma biblioteca .so
ou .pyd
dinâmica (que sua __file__
indicará) -. Isso é um detalhe de implementação que você não deve se preocupar com
Se você quiser entender como um Python-exigível, C-codificado obras de função estudando código, aprendendo a ler C é geralmente melhor (muito menos difícil do que realmente produtiva codificação em C ;-). No entanto, muitas vezes você vai encontrar (sugestivas, não-autoritária) "amostra implementações Python" de funcionalidade C-codificado, e você pode estudar os .
Um repositório particularmente proveitosa de equivalentes Python-codificados para o Python funcionalidade biblioteca padrão que está normalmente codificados em C é o PyPy projeto (que faz implementações Python codificados em Python) - suas fontes são browseable aqui e, claro, você pode baixar e ler-los em sua máquina.
Em particular, este é PyPy do _functools.py implementação:
""" Supplies the internal functions for functools.py in the standard library """
class partial:
"""
partial(func, *args, **keywords) - new function with partial application
of the given arguments and keywords.
"""
__slots__ = ['func', 'args', 'keywords']
def __init__(self, func, *args, **keywords):
if not callable(func):
raise TypeError("the first argument must be callable")
self.func = func
self.args = args
self.keywords = keywords
def __call__(self, *fargs, **fkeywords):
newkeywords = self.keywords.copy()
newkeywords.update(fkeywords)
return self.func(*(self.args + fargs), **newkeywords)
Pretty trivial para ler e entender, espero!
Outras dicas
Por favor, ser mais claro ao fazer perguntas próxima vez. Eu suponho que você quer este
>>> import _functools
>>> _functools.__file__
'/usr/lib/python2.6/lib-dynload/_functools.so'
É um _functools.so
objeto compartilhado, escrito em C. eu acho, ele é importado pelo módulo functools
real. Por que você está tentando importar com isso? Claro, é possível, no entanto, você pode muito bem from functools import partial
.
Para python2.6,
O módulo é uma _functools
incorporado. Você pode ver que se você simplesmente digitar import _functools ; repr(_functools)
e aperte enter em seu intérprete rápida.
Se você quiser ver a fonte C do módulo, veja http://hg.python.org/cpython/file/d7e85ddb1336/Modules/_functoolsmodule.c
Este módulo _functools
não tem um atributo __file__
(veja o próximo parágrafo) uma vez que é compilado para o intérprete.
Para python2.5,
O módulo _functools
é um módulo de biblioteca padrão implementado em C e está disponível em http : //hg.python.org/cpython/file/a78381ead4cf/Modules/_functoolsmodule.c se você quiser vê-lo. Você pode ver a localização de onde o módulo é carregado por import _functools ; print _functools.__file__
digitação em seu intérprete pronta ??p>
O comportamento da função functools.partial()
é descrito em PEP 309 em que foi definido. Os embora as implementações reais de built-ins são muitas vezes em C PEP de incluindo este geralmente contêm exemplo implementações em Python .
Este código de exemplo deve ser suficiente para você entender o comportamento de functools.partial()
. Se há uma questão específica sobre a implementação C que é preocupante que você vai ter que ler o código C. Ou talvez descrevê-lo na sua pergunta e alguém pode saber a resposta.