В чем разница: модуль импорта и модуль импорта модуля? - PullRequest
0 голосов
/ 27 сентября 2011

Вот моя программа, которая берет список слов и сортирует их от самых длинных до самых коротких и разрывает связи со случайным модулем.

import random  
def sort_by_length1(words):
    t = []
    for word in words:
        t.append((len(word), random(), word))

    t.sort(reverse = True)


    res = []
    for length, randomm, word in t:
        res.append(word)
    return res

Я получаю эту ошибку: Ошибка типа: объект 'module' не вызывается

Но когда я делаю: from module import module Это работает ?? Почему это так?

Ответы [ 4 ]

3 голосов
/ 27 сентября 2011
from random import random 

эквивалентно

import random as _random
random = _random.random

, поэтому, если вы только делаете

import random

, вы должны использовать

random.random()

вместо

random()
2 голосов
/ 27 сентября 2011
Модуль

random имеет функцию random. Когда вы делаете import random, вы получаете модуль, который, очевидно, не вызывается. Когда вы делаете from random import random, вы получаете функцию, которая вызывается. Вот почему вы не видите ошибку во втором случае.

Вы можете проверить это в своем REPL.

>>> import random
>>> type(random)
module
>>> from random import random
>>> type(random)
builtin_function_or_method
1 голос
/ 27 сентября 2011
from random import random

эквивалентно:

import random          # assigns the module random to a local variable
random = random.random # assigns the method random in the module random

Вы не можете вызвать сам модуль, но вы можете вызвать его метод random . Модуль и метод, имеющие одно и то же имя, сбивают людей с толку; синтаксис проясняет, какой вы имеете в виду.

0 голосов
/ 27 сентября 2011

Когда вы вызываете команду,

import random

Вы импортируете справочный модуль, который содержит все функции и классы. Эта ссылка теперь в вашем пространстве имен. Доступ к положительным персонажам внутри случайного модуля: random.func(arg1, arg2).

Это позволяет выполнять следующие вызовы случайного модуля:

>>> random.uniform(1, 5)
2.3904247888685806
>>> random.random()
0.3249685500172673

Итак, в приведенном выше коде, когда интерпретатор python попадает в строку,

t.append((len(word), random(), word))

random фактически ссылается на имя модуля и выдает ошибку, потому что имя модуля не вызывается, в отличие от функции, которую вы ищете, которая находится внутри.

Если бы вы взяли вместо этого

from random import random

Вы добавляете ссылку в своем пространстве имен к функции random внутри модуля random. Вы могли бы легко сказать from random import randint, что позволило бы вам без проблем позвонить randint(1, 5).

Надеюсь, это все хорошо объясняет.

...