Вот как импортировать строку в качестве модуля ( Python 2.x ):
import sys,imp
my_code = 'a = 5'
mymodule = imp.new_module('mymodule')
exec my_code in mymodule.__dict__
В Python 3 , exec является функция, поэтому это должно работать:
import sys,imp
my_code = 'a = 5'
mymodule = imp.new_module('mymodule')
exec(my_code, mymodule.__dict__)
Теперь получить доступ к атрибутам модуля (и функциям, классам и т. д.) как:
print(mymodule.a)
>>> 5
Чтобы игнорировать следующую попытку импорта, добавьте модуль в sys
:
sys.modules['mymodule'] = mymodule
(0...8).map { (65 + rand(26)).chr }.join
я провожу слишком много времени, играя в гольф.
(0...50).map { ('a'..'z').to_a[rand(26)] }.join
И последний это еще более сбивает с толку, но более гибко и тратит впустую меньше циклов:
o = [('a'..'z'), ('A'..'Z')].map(&:to_a).flatten
string = (0...50).map { o[rand(o.length)] }.join
Мне нравится ответ Радара лучше всего, до сих пор, я думаю. Я настроил бы немного как это:
CHARS = ('a'..'z').to_a + ('A'..'Z').to_a
def rand_string(length=8)
s=''
length.times{ s << CHARS[rand(CHARS.length)] }
s
end
С этим методом можно передать в abitrary длине. Это установлено как значение по умолчанию как 6.
def generate_random_string(length=6)
string = ""
chars = ("A".."Z").to_a
length.times do
string << chars[rand(chars.length-1)]
end
string
end
Сделать Ваше первое в один оператор:
(0...8).collect { |n| value << (65 + rand(25)).chr }.join()
Это почти столь же ужасно, но возможно как шаг в правильном направлении?
(1..8).map{|i| ('a'..'z').to_a[rand(26)]}.join
Я не знаю рубин, таким образом, я не могу дать Вам точный синтаксис, но я установил бы постоянную строку со списком приемлемых символов, затем использовать оператор подстроки для выбора случайного символа из него.
преимущество здесь состоит в том что, если строка, как предполагается, является пользователем-enterable, то можно исключить легко перепутанные символы как l и 1 и я, 0 и O, 5 и S, и т.д.
Мы использовали это на нашем коде:
class String
def self.random(length=10)
('a'..'z').sort_by {rand}[0,length].join
end
end
максимальная поддерживаемая длина равняется 25 (мы только используем ее со значением по умолчанию так или иначе, так не была проблема).
Кто-то упомянул это 'a'.. 'z' является субоптимальным, если Вы хотите полностью постараться не генерировать оскорбительные слова. Одна из идей, которые мы имели, удаляла гласные, но Вы все еще заканчиваете с WTFBBQ и т.д.
require 'sha1'
srand
seed = "--#{rand(10000)}--#{Time.now}--"
Digest::SHA1.hexdigest(seed)[0,8]
Это решение генерирует строку легко читаемых символов для кодов активации; я не хотел людей, путающих 8 с B, 1 со мной, 0 с O, L с 1, и т.д.
# Generates a random string from a set of easily readable characters
def generate_activation_code(size = 6)
charset = %w{ 2 3 4 6 7 9 A C D E F G H J K M N P Q R T V W X Y Z}
(0...size).map{ charset.to_a[rand(charset.size)] }.join
end
Я могу ' Не помню, где я это нашел, но мне кажется, что это лучший и наименее интенсивный процесс:
def random_string(length=10)
chars = 'abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ0123456789'
password = ''
length.times { password << chars[rand(chars.size)] }
password
end
Почему бы не использовать SecureRandom?
require 'securerandom'
random_string = SecureRandom.hex
# outputs: 5b5cd0da3121fc53b4bc84d0c8af2e81 (i.e. 32 chars of 0..9, a..f)
SecureRandom также имеет методы для:
см .: http: // ruby- doc.org/stdlib-1.9.2/libdoc/securerandom/rdoc/SecureRandom.html
] Другой метод, который я люблю использовать:[
] [ rand(2**256).to_s(36)[0..7]
]
[]Add []ljust[
] if you are really paranoid about the correct string length:[
rand(2**256).to_s(36).ljust(8,'a')[0..7]
] Ruby 1.9+:
ALPHABET = ('a'..'z').to_a
#=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
10.times.map { ALPHABET.sample }.join
#=> "stkbssowre"
# or
10.times.inject('') { |s| s + ALPHABET.sample }
#=> "fdgvacnxhc"
Я недавно делал что-то подобное, чтобы сгенерировать 8-байтовую случайную строку из 62 символов. Символы были 0-9, a-z, A-Z. У меня был их массив, так как он 8 раз зацикливался и выбирал случайное значение из массива. Это было внутри приложения Rails.
str = ''
8.times {|i| str << ARRAY_OF_POSSIBLE_VALUES[rand(SIZE_OF_ARRAY_OF_POSSIBLE_VALUES)] }
Странно то, что у меня много дубликатов. Случайным образом этого никогда не должно происходить. 62 ^ 8 огромен, но из примерно 1200 кодов в db у меня было хорошее количество дубликатов. Я заметил, что они происходят на часовых границах друг друга. Другими словами, я мог бы увидеть дуплекс в 12:12:23 и 2:12:22 или что-то в этом роде ... не уверен, проблема во времени или нет.
Этот код был перед созданием объекта ActiveRecord. Перед созданием записи этот код запускался и генерировал «уникальный» код. Записи в БД всегда производились надежно, но код ( str
в строке выше) слишком часто дублировался.
Я создал сценарий для выполнения 100000 итераций указанной выше строки с небольшой задержкой, так что это заняло бы 3-4 часа, надеясь увидеть какой-то повторяющийся шаблон на ежечасной основе, но ничего не увидел. Понятия не имею, почему это происходило в моем приложении Rails.
Я использую это для генерации случайных строк, удобных для URL, с гарантированной максимальной длиной:
rand(36**length).to_s(36)
Он генерирует случайные строки из строчных букв az и 0-9. Он не очень настраиваемый, но короткий и чистый.
В ruby 1.9 можно использовать метод выбора массива, который возвращает случайный элемент из массива