Надеемся, что это поможет кому-то новому в программировании и python:
Функция map()
должна применять ту же процедуру для каждого item
в iterable data structure
, например lists
, generators
, strings
и другие материалы.
Давайте посмотрим на пример: map()
может iterate
по каждому item
в list
и применить function
к каждому item
, чем return
(вернет вас) new list
.
Подумайте, что у вас есть function
, который принимает число (integer
), добавляет 1 к этому номеру и возвращает его.
def add_one(num):
new_num = num + 1
return new_num
У вас также есть list
номеров (integers
)
my_list = [1,3,6,7,8,10]
, если вы хотите increment
присвоить каждому номеру (integer
) в list
, вы можете сделать следующее:
map(add_one, my_list)
Примечание: минимально map()
требуется два arguments
. Сначала имя function
и второе что-то вроде результата list
.
вышеприведенного примера, map()
вернет вам это:
[2, 4, 7, 8, 9, 11]
Позволяет увидеть некоторые другие прохладный вещи map()
можно сделать. map()
может принимать несколько iterables
(lists, strings, etc
) и передавать element
из каждого list
(я использую список в качестве примера) в function
как argument
.
У нас есть следующие списки:
list_one = [1, 2, 3, 4, 5]
list_two = [11, 12, 13, 14, 15]
list_three = [21, 22, 23, 24, 25]
map()
может сделать вас new list
, который содержит добавление элементов в конкретном index
(положение).
Теперь запомните map()
, ему понадобится function
.
def add_from_three_lists(num1, num2, num3):
total_num = num1 + num2 + num3
return total_num
теперь позволяет использовать функцию map()
map(add_from_three_lists, list_one, List_two, list_three)
, и вы получите:
[33, 36, 39, 42, 45]
] ПОМНИТЕ: В Python2 map()
будет iterate
(пройдите через элементы lists
) в соответствии с самым длинным list
и передайте NoneType
функции для более короткого lists
, поэтому ваш function
должен искать NoneType
и обрабатывать их, иначе вы получите errors
. В python 3 map()
будет идти только по кратчайшему list
. Кроме того, в Python 3, map()
возвращает итератор, а не список.
Ниже сценария упрощенная версия, взятая от eycap, конкретно из этого файла.
set :dbuser "user"
set :dbhost "host"
set :database "db"
namespace :db do
desc "Get the database password from user"
task :get_password do
set(:dbpass) do
Capistrano::CLI.ui.ask "Enter mysql password: "
end
end
task :backup_name, :only => { :primary => true } do
now = Time.now
run "mkdir -p #{shared_path}/db_backups"
backup_time = [now.year,now.month,now.day,now.hour,now.min,now.sec].join('-')
set :backup_file, "#{shared_path}/db_backups/#{database}-snapshot-#{backup_time}.sql"
end
desc "Dump database to backup file"
task :dump, :roles => :db, :only => {:primary => true} do
backup_name
run "mysqldump --add-drop-table -u #{dbuser} -h #{dbhost} -p#{dbpass} #{database} | bzip2 -c > #{backup_file}.bz2"
end
end
Править: Да, я предполагаю, что упустил суть, что Вы искали задачу граблей и не capistrano задачу, но у меня нет граблей один под рукой, извините.
У меня нет задачи граблей для резервного копирования моего дб MySQL, но я действительно писал сценарий в Ruby, чтобы сделать просто что для моего DB WordPress:
filename = 'wp-config.php'
def get_db_info(file)
username = nil
password = nil
db_name = nil
file.each { |line|
if line =~ /'DB_(USER|PASSWORD|NAME)', '([[:alnum:]]*)'/
if $1 == "USER"
username = $2
elsif $1 == "PASSWORD"
password = $2
elsif $1 == "NAME"
db_name = $2
end
end
}
if username.nil? || password.nil? || db_name.nil?
puts "[backup_db][bad] couldn't get all needed info"
exit
end
return username, password, db_name
end
begin
config_file = open("#{filename}")
rescue Errno::ENOENT
puts "[backup_db][bad] File '#{filename}' didn't exist"
exit
else
puts "[backup_db][good] File '#{filename}' existed"
end
username, password, db_name = get_db_info(config_file)
sql_dump_info = `mysqldump --user=#{username} --password=#{password} #{dbname}`
puts sql_dump_info
Необходимо смочь взять это и сделать некоторое умеренное сокращение его, чтобы вставить username/password/dbname для подъема его и работающий на Вас. Я поместил его в свой crontab для выполнения каждый день также, и это не должно быть слишком много работы для преобразования этого для выполнения как задача граблей, так как это уже - код Ruby (могло бы быть хорошее осуществление изучения также).
Скажите нам, как это идет!
Существует a немногие решения уже на Google. Я собираюсь предположить, что Вы используете activerecord в качестве своего orm?
Если Вы выполняете направляющие, то Вы можете взгляды на Rakefile, который это использует для activerecord в \ruby\lib\ruby\gems\1.8\gems\rails-2.0.2-\lib\tasks\database.rake. Это дало мне большую информацию о том, как расширить универсальный Rakefile.
Вы могли взять capistrano задачи, которые обеспечивает thelsdj, и добавьте его к своему файлу граблей. Затем измените его немного так, чтобы это использовало activerecord соединение с базой данных.
Существует плагин, там названный "mysql задачи", просто Google для него. Это - просто rakefile - я нашел это очень простым в использовании.
Удостоверьтесь, что добавили "-стандартные программы" параметр к mysqldump, если Вы имеете, любой сохранил procs в Вашей базе данных, таким образом, это создает резервную копию их также.
На тот случай, если люди все еще ищут решения, в настоящее время мы используем плагин ar_fixtures для резервного копирования нашей базы данных, а также части решения.
Он предоставляет rake db : fixtures: dump
задач. Это выводит все, что есть в YAML, в test / fixtures, поэтому его можно снова загрузить с помощью db: fixtures: load
.
Мы используем это для резервного копирования перед каждым запуском функции. Мы также использовали это при переходе с sqlite3 на Postgres - эта тонкость очень полезна, поскольку несовместимость между диалектами SQL по большей части скрыта.
Всего наилучшего, D